左側にアイテムのリスト、右側にテーブルがあるスイングアプリケーションを構築しています。右側に表示されるテーブルの数は、左側で選択されたアイテムによって異なります。表示されているすべてのテーブルで同じであるすべての行を「ハイライト」(setBackground)できるようにしたい。
prepareRendererまたはgetTableCellRendererComponentのオーバーライドについて読みました。条件付きレンダリングロジックは、オーバーライドメソッド内にあります。
DefaultTableCellRenderergetTableCellRendererComponentが呼び出されることはありませ んhttp://tips4java.wordpress.com/2010/01/24/table-row-rendering/http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer
しかし、私が言えることと私が理解していること(間違っている場合は訂正してください)から、どちらのオプションでも、このオーバーライドされたメソッド内で2つの異なるJTableを同時に比較することはできません。prepareRendererは、JTableを拡張するクラスでオーバーライドされるため、特定のテーブルでインスタンス化されます。オーバーライドされたメソッドは、テーブルのその特定のインスタンスにのみ影響します。
public class CustomRenderer extends JTable {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
// add custom rendering here
return c;
}};
...
CustomRenderer currTable = new CustomRenderer();
getTableCellRendererComponentは、特定のJTableのcolumnModelから特定の列のsetCellRendererを介して設定されます。
public class CustomRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (isSelected) {
l.setBackground(Color.gray);
}
else {
l.setBackground(Color.white);
}
return l;
}};
...
CustomRenderer cr = new CustomRenderer();
currTable.getcolumnModel().getColumn(1).setCellRenderer(cr);
では、どうすればいいですか
if(tableOne.getValueAt(1, 1).equals(tableTwo.getValueAt(1, 1)
//set Cell 1,1 background(Color.blue)
else
//set Cell 1,1 background(Color.red)
現在、isSelectedブール値をテストし、それに応じて背景を変更するgetTableCellRendererComponentメソッドで複数のテーブルセルの選択を使用する非常に醜いハックがあります。今のところこれで十分ですが(このプログラムを使用しているのは私だけなので)、別のテーブルの条件または値に基づいて、あるテーブルのレンダリングを同時に比較および変更できるより良い方法が必要です。
それとも私は問題について間違っているのでしょうか?
読んだり返信したりしてくれてありがとう