我创建了一个我创建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();
}
}
答案 0 :(得分:2)
为了指出正确的方向,这是一个稍微清洁的班级工作版本。如果您有大量数据,请注意更新此类表格效率不高!你最好自己继承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);
}
答案 1 :(得分:1)
rowData
在构造函数中被赋予JTable。然后在updateTable
中,您只需更新rowData
中的TableClass
字段即可。因此,JTable
及其TableModel
都不了解您的更改。您需要在updateTable
中更新表格的模型。
换句话说,当你更新rowData
中的updateTable
时,你没有更新你在构造函数中传递给JTable的rowData
对象。
以下课程在功能上与您的课程相同。这是否更清楚为什么你所做的事没有效果?你看,tableData和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)后,我将更新以下代码以显示如何更新整个数据Vector或Vectors在updateTable
。我仍然不会在生产代码中这样做,但至少这在功能上是正确的,更接近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);
}
}
正如我所说,这不是一个很好的方法,但我只是想告诉你为什么你所做的不起作用。 :)
答案 2 :(得分:0)
当你写:
rowData = rowDataInput;
它不会更改您在构造函数中传递给jTable的rowData
。