gpt4 book ai didi

java - JTable 中 fireTableDataChanged 的​​奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:21:31 25 4
gpt4 key购买 nike

到目前为止,我对 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;
}
};

这是为了确保行会根据选择的 boolean 列值改变颜色。在我的 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 应该根据需要 fireTableXxxXxxx() 以通知所有听众。 DefaultTableModel 会自动执行此操作; AbstractTableModel 应该在 setValueAt() 中这样做。一个这样的听众是表本身。如果“其他处理程序需要知道单元格的位置”,他们可以 register对于 TableModelEvent 实例,通过 addTableModelListener()。他们还可以监听 User Selections根据需要。

关于java - JTable 中 fireTableDataChanged 的​​奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com