Java JTable-won';t刷新
为什么表单元格0,1不会从aaa更改为XXXXJava JTable-won';t刷新,java,swing,jtable,jframe,defaulttablemodel,Java,Swing,Jtable,Jframe,Defaulttablemodel,为什么表单元格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 = n
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"});
}
}
使用静态方法编辑(更好的解决方案,它完美地为我工作)。由于我通过另一个帧在数组中添加新数据,所以我在大型机中创建了一个静态方法,每次在数组中添加/更新/删除对象时都会调用该方法。此方法将在更新后重做整个模型,因此将刷新表。您的问题(以及上一个问题)的解决方案相当简单,但遗憾的是,有点太长,无法在注释中发布
JTable
的实际工作原理。一个好的起点是最重要的类和类的javadoc,甚至可能是javadoc。关于Swing和MVC使用的另一本好书是。它比仅JTable
s要广泛得多,但它将为您提供关于所有Swing组件的设计以及如何使用它们的更多见解TableModel
),所以对take的更新应该在模型端进行。如果不清楚,请返回步骤1TableModel
的代码以及更新TableModel
的代码,因为这是您最可能出现问题的位置您的问题(以及上一个问题)的解决方案相当简单,但遗憾的是,它太长了,无法在评论中发布
JTable
的实际工作原理。一个好的起点是最重要的类和类的javadoc,甚至可能是javadoc。关于Swing和MVC使用的另一本好书是。它比仅JTable
s要广泛得多,但它将为您提供关于所有Swing组件的设计以及如何使用它们的更多见解TableModel
),所以对take的更新应该在模型端进行。如果不清楚,请返回步骤1TableModel
的代码以及更新TableModel
的代码,因为这是您最可能出现问题的位置发布在相关线程上的SSCCE的一个问题是,代码更改了最初形成表模型的数组,而它应该更改表模型本身。发布在相关线程上的SSCCE的一个问题是,代码更改了最初形成表模型的数组,然而,它应该改变表格模型本身。为了更快地获得更好的帮助,请发布一篇文章。我支持Andrew的伟大建议,因为我认为我们无法根据当前的信息猜出错误。还可以考虑用一个充满活力的So.Out.PrtLn调用代码来帮助调试错误源,并确保您的假设都是正确的。可能的复制品有多少次,您打算发布完全相同的问题而没有任何理解进展的迹象,总是没有SCSCE?很简单,因为您使用的是DefaultTableModel,所以无需执行任何操作。如果模型发生更改,JTable将自动更改其视图的状态,因为模型知道要触发通知视图更新的通知方法。由于这种情况没有发生,这表明某个地方有一个bug,这就是我们无法帮助您的原因。为了更快地获得更好的帮助,请发布一条。我支持Andrew的伟大建议,因为我认为我们无法根据现有信息猜出哪里出了问题。还可以考虑用一个充满活力的So.Out.PrtLn调用代码来帮助调试错误源,并确保您的假设都是正确的。可能的复制品有多少次,您打算发布完全相同的问题而没有任何理解进展的迹象,总是没有SCSCE?很简单,因为您使用的是DefaultTableModel,所以无需执行任何操作。如果模型发生更改,JTable将自动更改其视图的状态,因为模型知道要触发通知视图更新的通知方法。由于没有发生这种情况,这表明某个地方有一个bug,这就是为什么我们还不能帮助您。问题是,该表显示了我存储在数组中的sql查询的数据。另外,当我添加产品时,我将其添加到DB中,而不仅仅是tablemodel。然后我如何检索数据