2017-06-18 5 views
0

私はJavaアプリケーションの中にJTableを持っていて、テーブルの最後の行の背景色を変更するカスタムレンダラーがあります。このように:JTableカスタムレンダラーを保持する方法は、ウィンドウのサイズを変更しますか?

enter image description here

:私は、ウィンドウのサイズを変更すると、それはこのようになります、しかし

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){ 
    @Override 
    public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, int col) { 

     super.getTableCellRendererComponent(table, value, isSelected, 
              hasFocus, row, col); 

     String status = (String)table.getModel().getValueAt(row, 0); 
     if ("Total".equals(status)) { 
      setBackground(Color.GRAY); 
      setForeground(Color.WHITE); 
     } 

     this.setHorizontalAlignment(CENTER); 
     return this; 
    } 
}); 

enter image description here

私は、カスタムレンダラのために次のコードであることを達成します

通常の状態に戻すには、テーブルをクリアしてアイテムを再度追加する必要があります。サイズ変更時の表の見た目?ありがとうございました。

答えて

6

あなたは戻って色を設定するelseブロックを忘れてしまった:それ以外の場合は、レンダラは、「設定」とホワイト/グレーのすべてのセルを色付けしますまま

if ("Total".equals(status)) { 
    setBackground(Color.GRAY); 
    setForeground(Color.WHITE); 
} else { 
    // set colors back to the default settings 
    setBackground(null); 
    setForeground(null); 
} 

を。レンダラーはゴム印のようなもので、同じことがたくさんあります。色を変更して元の色に戻していない場合、スタンプはカラーモードで「固まっています」。

+0

ありがとうございました!私はスタックオーバーフローが今私がそれを受け入れることができないので、あなたの答えを5分で受け入れるでしょう。 –

+1

@AlexandreKrabbe:まず、Camickrの常に優れた提案を重視しています。私からの彼の答えに1+の賛成投票。 –

3

実際には、「数量」列と「価格」列の文字列データを格納しないでください。代わりに、IntegerとDoubleの値を格納する必要があります。つまり、3つのカスタムレンダラーを作成する必要があります。

もう1つの方法は、JTableのprepareRenderer(...)メソッドをオーバーライドして背景色を設定することです。

このアプローチの詳細と例については、Table Row Renderingを参照してください。

+0

(1+)いつものように優れた提案 –

+0

ありがとう、私はそれを見てみましょう。 –

関連する問題