3

到目前为止,我对 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)因为其他处理程序需要知道单元格的位置。但是,在这种情况下,只有当我单击表中的其他行时,该行才会更改,就好像它被延迟并等待其他事件发生一样。

任何想法为什么会这样?

4

2 回答 2

2
  • 必须通知正确的方法,fireTableCellUpdated(row, col);

  • 有关AbstractTableModel 和 prepareRenderer 及其方法的更多信息,请阅读评论@camickr

  • 看看过滤或排序convertXxxToModel的情况JTable,ei

于 2012-08-02T16:22:48.940 回答
2

您的(看不见的)TableModel应按fireTableXxxXxxx()要求通知所有听众。DefaultTableModel自动执行此操作;AbstractTableModel应该这样做setValueAt()。一个这样的监听器是表本身。如果“其他处理程序需要知道单元格的位置”,他们可以TableModelEvent通过addTableModelListener(). 他们还可以根据需要侦听用户选择

于 2012-08-02T18:33:13.027 回答