首页 > 解决方案 > JTable 中的 JComboBox 不会在项目更改时立即更新表

问题描述

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

我知道我可以只从组合框中获取值,但是我想在从表中的任何组合框中选择一个选项后立即将表保存到文件中,并且我无法找到动态的方法确定组合框属于哪一行,以便可以在项目更改时更新表。

一旦组合框项目侦听器被触发,有没有办法让表格更新为所选值?

这是一个演示此问题的示例:

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);
}

标签: javaswingjtablejcombobox

解决方案


一旦组合框项目侦听器被触发,有没有办法让表格更新为所选值?

不要依赖 ItemListener(或 ActionListener)。这些事件只是表明组合框的选定项已更改。

现在编辑器将控制并从表中删除自己并TableModel使用选定的值更新。

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

TableModelEvent将生成A指示数据已更改。

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


推荐阅读