【发布时间】:2012-03-20 18:52:52
【问题描述】:
为什么表格单元格 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 中创建了一个静态方法,每次在数组中添加/更新/删除对象时都会调用该方法。此方法将在更新后重做整个模型,因此会刷新表。
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
我赞同 Andrew 的建议,因为我认为我们无法根据现有信息猜测出什么问题。还可以考虑在代码中添加大量 System.out.println 调用,以帮助调试错误源并确保您的假设都是正确的。
-
您打算多久发布一次完全相同的问题,而在理解方面没有任何进展的迹象并且总是没有 sscce?
-
@vedran: 简单地说,由于您使用的是 DefaultTableModel,因此您需要什么都不做。如果模型发生更改,JTable 将自动更改其视图的状态,因为模型知道触发通知方法来告诉视图进行更新。由于这没有发生,这表明某处存在错误,这就是我们无法为您提供帮助的原因。
标签: java swing jtable jframe defaulttablemodel