编程语言
首页 > 编程语言> > java-JTable中fireTableDataChanged的怪异行为

java-JTable中fireTableDataChanged的怪异行为

作者:互联网

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

知道为什么会这样吗?

解决方法:

您的(看不见的)TableModel应该根据需要触发TableXxxXxxx()以便通知所有侦听器. DefaultTableModel自动执行此操作; AbstractTableModel应该在setValueAt()中这样做.表本身就是这样的一种监听器.如果“其他处理程序需要知道单元格的位置”,则可以通过addTableModelListener()为TableModelEvent实例设置register.他们还可以根据需要收听User Selections.

标签:swing,jtable,abstracttablemodel,events,java
来源: https://codeday.me/bug/20191101/1980396.html