我的表将在运行时更改整个数据集。
我当前的代码如下所示,
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()
的AbstractTableModel
方法,但是无法使其工作。我希望它会起作用,因为DefaultTableModel
是从AbstractTableModel
继承的。任何帮助表示赞赏。
- - - -编辑 - - - -
如果以前不太清楚,请原谅我,但问题是我想更新整个数据集。甚至列名以及列和行的数量也会改变。
例如,在上面的代码中,我可以执行此操作,它仍然可以按您期望的那样工作。
//Get new values
columnNames = new String[]{"Country", "Location", "Latitudes"};
data = new Object[][]{ {"John", "Blue", "1"}, {"Oliver", "Green", "4"}};
//Update table
最佳答案
您应该在创建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()
,并确保正确跟踪行数。最常见的错误之一是在添加数据后忘记增加行数,并认为表模型未接收数据。