JTable 中的 JComboBox 不会在项目更改时立即更新 table

JComboBox in JTable does not update table instantly on item change

我有一个带有 JComboBoxes 的 JTable 作为其中一列的单元格编辑器。当用户单击其中一个组合框中的选项之一时,table 单元格应立即设置为从组合框中选择的任何选项。然而遗憾的是,直到用户单击其他地方或按 Enter 键后才会发生这种情况。

我知道我可以只从组合框中获取值,但我想在从 table 中的任何组合框中选择一个选项后立即将 table 保存到文件中,而且我还没有找到一种方法来动态识别组合框属于哪一行,以便 table 可以在项目更改时更新。

有没有办法让 table 在触发组合框项目侦听器后立即更新为所选值?

下面是一个演示此问题的示例:

public static void main(String args[]) {
    JFrame frame = new JFrame();
    frame.setSize(450, 250);

    JTable table = new JTable(2, 1);

    TableColumn testColumn = table.getColumnModel().getColumn(0);

    JComboBox<String> comboBox = new JComboBox<String>();
    comboBox.addItem("Item1");
    comboBox.addItem("Item2");
    comboBox.addItem("Item3");
    testColumn.setCellEditor(new DefaultCellEditor(comboBox));

    comboBox.addItemListener(new ItemListener(){
        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED){
                System.out.println(table.getValueAt(0, 0));
            }
        }
    });

    frame.add(table);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

Is there a way to get the table to update with the chosen value as soon as the combobox item listener is fired?

不要依赖于 ItemListener(或 ActionListener)。这些事件只是表示组合框的选中项发生了变化。

现在编辑器将取得控制权并将其自身从 table 中删除,并使用所选值更新 TableModel

如果您想知道 TableModel 中的数据何时更改,请在 TableModel 中添加一个 TableModelListener

将生成一个TableModelEvent,表示数据已更改。

有关简单示例,请参阅:JTable -> TableModeListener