为什么表格单元格0,1不会从aaa变为XXXX?
import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
class MainFrame {
public static void main(String[] args) {
JFrame f = new JFrame("Refreshing JTable");
JPanel p = new JPanel(new GridBagLayout());
DefaultTableModel productsModel;
JTable productsTable;
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] tableTitle = new String[] {"ID", "Name"};
String[][] tableData = {{"1", "AAA"},{"2", "BBB"}};
productsModel = new DefaultTableModel(tableData, tableTitle);
productsTable = new JTable(productsModel) {
public boolean isCellEditable(int r, int c) {
return false;
}
};
JScrollPane scrollpane = new JScrollPane(productsTable);
tableData[0][1] = "XXXX";
f.add(p);
p.add(scrollpane);
f.validate();
f.setVisible(true);
}
}
原因: 显然,尝试更新存储数据的数组将导致JTable不会改变。需要更新DefaultTableModel或者需要重新绘制整个表。
编辑(可能的解决方案)一种方法是使用计时器:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
class MainFrame {
static JFrame f = new JFrame("Refreshing JTable");
static JPanel p = new JPanel(new GridBagLayout());
static DefaultTableModel productsModel;
static JTable productsTable;
public static void main(String[] args) {
runGui();
}
@SuppressWarnings("serial")
public static void runGui() {
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] tableTitle = new String[] {"ID", "Name"};
String[][] tableData = {{"1", "AAA"},{"2", "BBB"}};
productsModel = new DefaultTableModel(tableData, tableTitle);
productsTable = new JTable(productsModel) {
public boolean isCellEditable(int r, int c) {
return false;
}
};
JScrollPane scrollpane = new JScrollPane(productsTable);
tableData[0][1] = "XXXX";
Timer t = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addColumns();
remakeData();
productsTable.setModel(productsModel);
}
});
t.start();
f.add(p);
p.add(scrollpane);
f.validate();
f.setVisible(true);
}
private static void addColumns() {
productsModel.setColumnCount(0);
productsModel.addColumn("ID");
productsModel.addColumn("Name");
}
private static void remakeData() {
productsModel.setRowCount(0);
productsModel.insertRow(productsModel.getRowCount(), new Object[] {"1", "Dummy item 1"});
productsModel.insertRow(productsModel.getRowCount(), new Object[] {"2", "Dummy itme 2"});
productsModel.insertRow(productsModel.getRowCount(), new Object[] {"3", "Dummy item 3"});
productsModel.insertRow(productsModel.getRowCount(), new Object[] {"4", "Dummy item 4"});
productsModel.insertRow(productsModel.getRowCount(), new Object[] {"5", "Dummy item 5"});
}
}
编辑(更好的解决方案,它对我的工作方式完美无缺)使用静态方法。由于我是通过另一个Frame在数组中添加新数据,我在MainFrame中创建了一个静态方法,每次我在数组中添加/更新/删除Object时都会调用它。此方法将在更新后重做整个模型,因此将刷新表。
答案 0 :(得分:3)
您的问题(以及之前的问题)的解决方案相当简单,但不幸的是,将其发布在评论中有点太长
JTable
的实际工作方式进行了一些阅读。一个很好的起点是Swing tutorial,甚至可能是最重要的类JTable
和TableModel
的类javadoc。关于Swing和MVC的使用的另一个好读物是this document。它比JTable
更广泛,但会为您提供有关如何设计所有Swing组件以及如何使用它们的更多信息。TableModel
),因此应该在模型端进行更新。如果不清楚,请返回步骤1 TableModel
代码以及更新TableModel
的代码,因为这是您问题的最有可能的位置。答案 1 :(得分:3)
在您的相关线程上发布的SSCCE的一个问题是代码更改了最初构成表模型的数组,而它应该更改表模型本身。