これまで、次のような JTable の定義がありました。
JTable table = new JTable(model) {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
TradeTableModel model = (TradeTableModel) getModel();
if ((Boolean) model.getValueAt(row, model.findColumn("Select"))) {
Side s = (Side) model.getValueAt(row, model.findColumn("Side"));
if (s == Side.BUY)
c.setBackground(Color.BLUE);
else
c.setBackground(Color.red);
}
else {
c.setBackground(Color.white);
}
return c;
}
};
これは、ブール列値の選択に基づいて行の色が変わることを確認するためでした。私AbstractTableModel
は次のように設定値メソッドを指定しました:
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
assert columnIndex == 5;
try{
Selectable t = trades.get(rowIndex);
t.setSelected((Boolean)aValue);
fireTableDataChanged();
//fireTableCellUpdated(rowIndex, columnIndex);
}
catch(Exception e){
throw new IllegalArgumentException("Object to set was not subtype of boolean");
}
}
GUIのチェックボックスをクリックするfireTableDataChanged()
と、色が更新されます。fireTableCellUpdated(rowIndex, columnIndex)
ただし、他のハンドラーがセルの場所を知る必要があるため、本当に送信したいと思います。ただし、このシナリオでは、テーブル内の他の行をクリックした場合にのみ行が変更され、他のイベントが発生するのを遅らせて待っているかのように見えます。
なぜそうなるのですか?