【问题标题】:Java Swing: JTable tableChanged does not work after model is updatedJava Swing:模型更新后 JTable tableChanged 不起作用
【发布时间】:2016-07-03 00:47:20
【问题描述】:

加载时,我的 JTable 有 2 列 - .所以它在第一列是一个字符串,在第二列是一个复选框。当我点击复选框时,tableChanged 被触发,我可以打印被选中的行数据。

当用户在下拉列表中选择新类别时,我需要更改表格数据。 当表数据更新时,我单击复选框 tableChanged 不再被触发。 这就是我所拥有的: 这就是我更新表格数据的方式:

 comboBox.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    String t = (String) comboBox.getSelectedItem();
                    if (t.equals("survey2")) {
                        String[] columnNames = { "Volume Name", "Select" };
                        Object[][] data = { { "pt1", false }, { "pt2", false },
                                { "pt3", false }, { "pt4", false },

                        };

                        model = new DefaultTableModel(data, columnNames);

                        table.setModel(model);

                    }
                }
            });

这是我的tableChanged:

table.getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {


                if ((Boolean)table.getModel().getValueAt(table.getSelectedRow(), 1)) {


                    System.out.println(">\t"
                            + table.getValueAt(table.getSelectedRow(), 0));

                } else {

                    System.out.println(">\t"
                            + table.getValueAt(table.getSelectedRow(), 0));
                }

            }
        });

我不明白为什么更新模型后没有触发事件。我是否错误地更新了表格?

【问题讨论】:

    标签: java swing jtable defaulttablemodel


    【解决方案1】:

    您正在创建一个新的TableModel,但您将ChangeListener 添加到旧的TableModel

    不要创建新的 TableModel!

    您可以使用setRowCount(0) 清除数据。

    您可以使用以下方法将新数据添加回DefaultTableModel

    1. setDataVector(...) 方法,或
    2. 通过使用addRow(...) 方法一次将数据添加回模型一行。

    因此无需创建新的 TableModel。如果您想创建一个新的 TableModel,那么您还需要将您的 ChangeListener 添加到这个新模型中。

    【讨论】:

    • 感谢您的回复。我试过你说的:这就是我现在拥有的:model.setRowCount(0); model.setDataVector(data1, columnNames1); //model.fireTableDataChanged(); table.setModel(模型);在 model.setRowCount(0) 上触发 addTableModelListener 并在这一行 if ((Boolean) table.getModel().getValueAt(table.getSelectedRow(), 1)) { 抛出异常:java.lang.ArrayIndexOutOfBoundsException: -1我尝试切换model.fireTableDataChanged();。没有任何区别。
    • 我只想更新组合框选择更改的数据,并在选中第二列中的复选框时使用 tableChanged 拉行数据
    • @user1472972,您永远不应该手动调用任何fireXXX(...) 方法。这就是 TableModel 的工作。由于您没有更改模型,因此无需调用 setModel()。您需要做的就是使用我建议的两个语句更改模型中的数据。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2020-11-12
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多