动态更新jTable

时间:2014-07-23 19:07:17

标签: java swing jtable

我的表将在运行时更改整个数据集。 我目前的代码如下所示,

public class gui_test_form extends JFrame{
    private JPanel rootpanel;
    private JTable testTable;
    private JScrollPane testScrollPane;
    private JButton testButton;

    private String[] columnNames = {"Name", "Color"};
    private Object[][] data = { {"John", "Blue"}, {"Oliver", "Green"}, {"Paul", "Red"} };

    public gui_test_form() {
        super("GUI TEST");
        setContentPane(rootpanel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);

        testButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) { // Button Clicked
                //Get new values
                data[0][0] = "New Value";
                //Update table
                testTable.setModel(new DefaultTableModel(data, columnNames));
            }
        });
    }
}

代码按我的预期工作。但我不认为每次制作一个新的DefaultTableModel是最好的方法。我该怎么办?

我简要介绍了fireTableChanged()的{​​{1}}方法,但无法使其正常工作。我预计它会起作用,因为AbstractTableModel继承自DefaultTableModel

感谢任何帮助。

------- -------编辑
如果我以前不清楚,请原谅我,但问题是我想要更新整个数据集。甚至列名称和列数和行数也会发生变化 例如,在上面的代码中,我可以这样做,它仍然可以按照您的预期工作。

AbstractTableModel

2 个答案:

答案 0 :(得分:2)

您应该在创建JTable的同一级别声明单个表模型,并根据需要对该表模型进行更改,而不是在事件处理程序中声明它。

private JPanel rootpanel;
private JTable testTable;
private DefaultTableModel tableModel;
private JScrollPane testScrollPane;
private JButton testButton;

tableModel = new DefaultTableModel();
testTable = new JTable(tableModel);

看看Java Tutorial。请注意有关监听表数据更改的部分

如果您想出自己的表模型,则需要确保完全实现所有重写的方法,尤其是setValueAt(),并确保正确跟踪行数。最常见的错误之一是在添加数据并认为表模型没有接收数据后忘记增加行数。

答案 1 :(得分:0)

在要更新模型的任何位置添加以下代码。

model.addRow(new Object[]{txt_title.getText(), txt_name.getText()});

之前,还必须预先全局定义模型和表。

DefaultTableModel model = new DefaultTableModel();