我创建了一个类,用于创建jtable。我有一些问题,因为当我尝试更新它时,它不起作用(什么都没发生——我认为我尝试更新的方式是错误的?)。我做错了什么?
class tableClass
{
public Vector rowData = null;
public Vector columnNames = null;
private JTable jTable;
DefaultTableModel model;
public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput)
{
rowData = rowDataInput;
columnNames = columnNamesInput;
jTable = new JTable(rowData, columnNames);
jTable.setFillsViewportHeight(true);
JScrollPane jScrollPane = new JScrollPane(jTable);
jScrollPane.setPreferredSize(new Dimension(300, 100));
jPanel.add(jScrollPane,BorderLayout.CENTER);
}
public void updateTable(Vector rowDataInput)
{
rowData = rowDataInput;
model =(DefaultTableModel)jTable.getModel();
model.fireTableDataChanged();
}
}
为了给您指明正确的方向,这里有一个稍微干净一点的类工作版本。如果你有很多数据,请注意这样更新表是无效的!您最好自己将AbstractTableModel子类化,并映射到您已经拥有的任何数据结构。
public class Table {
public Vector<String> columnNames;
private JTable table;
public Table(JPanel panel, Vector<Vector<Object>> rowData,
Vector<String> columnNames) {
this.columnNames = columnNames;
table = new JTable(rowData, columnNames);
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setPreferredSize(new Dimension(300, 100));
panel.add(scrollPane, BorderLayout.CENTER);
}
public void updateTable(Vector<Vector<Object>> rowData) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setDataVector(rowData, columnNames);
}
rowData
被赋予构造函数中的JTable。然后在updateTable
中,只需更新TableClass
中的rowData
字段。因此,JTable
及其TableModel
都不知道您的更改。您需要在updateTable
中更新表的模型。
换句话说,当您在updateTable
中更新rowData
时,您并没有更新传递到构造函数中JTable的同一个rowData
对象。
下面的类在功能上与您的类相同。这会让你更清楚为什么你所做的没有效果吗?您可以看到,TableClass和JTable并没有共享rowData。它不应该——你应该更新TableModel。您可以实现自己的TableModel,并使用更改更新该对象。
class tableClass
{
public Vector columnNames = null;
private JTable jTable;
DefaultTableModel model;
public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput)
{
Vector rowData = rowDataInput;
columnNames = columnNamesInput;
jTable = new JTable(rowData, columnNames);
jTable.setFillsViewportHeight(true);
JScrollPane jScrollPane = new JScrollPane(jTable);
jScrollPane.setPreferredSize(new Dimension(300, 100));
jPanel.add(jScrollPane,BorderLayout.CENTER);
}
public void updateTable(Vector rowDataInput)
{
Vector rowData = rowDataInput;
model =(DefaultTableModel)jTable.getModel();
model.fireTableDataChanged();
}
}
您可以按照如下方式更改代码,以证明这些更改是有效的请注意我并不提倡这种方法-您应该真正实现自己的TableModel,只是简单地向您展示如何更改底层模型本身,从而在屏幕上的JTable中看到更改。
编辑由于此答案已被接受,根据@kleopatra的评论并使用@Adam的答案(+1),我更新了以下代码,以显示如何更新updateTable
中的整个数据Vector或Vectors。我仍然不会在生产代码中这样做,但至少这在功能上是正确的,更接近于OP的问题。
class MyTable {
private Vector columnNames = null;
private JTable jTable;
public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput) {
// ...
jTable = new JTable(rowData, columnNames);
// ...
}
public void updateTable(Vector rowDataInput) {
model =(DefaultTableModel)jTable.getModel();
// Now actually update the model with your new data:
model.setDataVector(rowDataInput, columnNames);
}
}
正如我所说,这不是一个好方法,但我只是想向你展示为什么你所做的不起作用。:)
编写时:
rowData = rowDataInput;
它不会更改您在构造函数中传递给jTable的CCD_ 12。