更新jtable-java时出现的问题
我创建了一个类,在其中我创建了jtable。我有一些问题,因为当我尝试更新它时,它不起作用(什么都没有发生-我认为我尝试更新它的方式是错误的?)。我做错了什么更新jtable-java时出现的问题,java,swing,jtable,Java,Swing,Jtable,我创建了一个类,在其中我创建了jtable。我有一些问题,因为当我尝试更新它时,它不起作用(什么都没有发生-我认为我尝试更新它的方式是错误的?)。我做错了什么 class tableClass { public Vector rowData = null; public Vector columnNames = null; private JTable jTable; DefaultTableModel model; public tableCla
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();
}
}
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();
}
}
您可以按如下方式更改代码,以证明更改是有效的注意我并不提倡这种方法-您应该真正实现自己的表格模型,但只需向您展示如何更改基础模型本身,从而在屏幕上的JTable中看到所发生的更改
编辑因为此答案已被接受,在@kleopatra的评论之后,我使用@Adam的答案(+1)更新了下面的代码,以显示如何更新updateTable
中的整个数据向量。我仍然不会在生产代码中这样做,但至少这在功能上是正确的,更接近OPs问题
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的
rowData
。为您指明正确的方向,这里有一个稍微干净的类工作版本。如果您有大量数据,请注意这样更新表是没有效率的!您最好自己将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);
}
公共类表{
公共向量列名称;
专用JTable表;
公共表(JPanel面板、矢量行数据、,
向量列名称){
this.columnNames=columnNames;
表=新的JTable(行数据、列名称);
表.setFillsViewPerthweight(真);
JScrollPane scrollPane=新的JScrollPane(表);
scrollPane.setPreferredSize(新维度(300100));
panel.add(滚动窗格,BorderLayout.CENTER);
}
公共void updateTable(矢量行数据){
DefaultTableModel=(DefaultTableModel)table.getModel();
model.setDataVector(行数据、列名称);
}
您在updateTable
中没有更改任何内容,如果您什么都不更改,您希望会发生什么?“rowData”包含新的内容数据,我相信该模型。fireTableDataChanged();应该刷新它吗?您将rowData
指向rowDataInput
,JTable
不知道这一点,它仍然指向旧的rowData
。我相信您对这里的指针感到困惑。底线是,告诉您的表模型数据已更改,然后调用fireTableDataChanged
顺便说一句,只通知附加视图,例如JTable
@stryba-不,不要调用fireTableDataChanged,从模型外的代码更改,这完全是模型实现的工作。@kleopatra你是对的,我忘了我们在模型外,我的错。谢谢你指出。在更新中,我还有'model=(DefaultTableModel)'jTable.getModel();model.fireTableDataChanged()“或者我遗漏了什么?是的-在构造函数中传递给JTable的rowData永远不会更改…您只是更新对rowData的引用,而不是rowData本身或JTable知道的任何内容。您有没有可能给我举个例子?非常感谢,在更新部分不幸的是,您的代码没有执行OP(可能)想要实现的任何操作:这类似于批量替换支持DefaultTableModel的dataVector。听起来您还没有更改模型。请更新(添加新代码)你的问题,我会再看一眼:)。不需要从外面发射任何东西,DefaultTableModel表现良好:-)@kleopatra很好。现在编辑完毕,几乎什么都没有了!@Adam我更新了我的答案,加入了你的(更好、更完整)演示如何一次性替换所有基础数据的示例。我也对您的答案投了赞成票。