到目前为止,我对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");
}
}
如果我使用fireTableDataChanged()
颜色会更新,因为我点击了gui上的复选框。但是,我真的想发送fireTableCellUpdated(rowIndex, columnIndex)
,因为其他处理程序需要知道单元格的位置。但是,在这种情况下,只有在我单击表中的其他行时行才会更改,就像它被延迟并等待其他事件发生一样。
任何想法为什么会这样?
答案 0 :(得分:2)
必须通知正确的方法fireTableCellUpdated(row, col);
有关AbstractTableModel and prepareRenderer及其方法的更多信息,请阅读@camickr
在过滤或排序convertXxxToModel
的情况下查看JTable
,e.i。
答案 1 :(得分:2)
您(看不见)TableModel
应fireTableXxxXxxx()
按要求通知所有听众。 DefaultTableModel
会自动执行此操作; AbstractTableModel
应在setValueAt()
中执行此操作。一个这样的倾听者就是桌子本身。如果“其他处理程序需要知道单元格的位置”,则可以TableModelEvent
通过addTableModelListener()
实例register。他们还可以根据需要收听User Selections。