我有一个在其中使用JTable的应用程序。当我向数据库添加一些东西时,它会进入数据库,但我无法以某种方式重新创建JTable ..我试过重新粉刷();创建我的表的方法,我已经尝试了Revalidate();但也没有成功
我甚至试图回忆方法,但也没有帮助。
执行的操作如下:
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == add) {
model.insertValue(toDo.getText());
model.getValue();
view.createTable();
toDo.setText("");
}
}
和创建JTable
的方法 public void createTable() {
JTable table = new JTable();
DefaultTableModel tableModel = new DefaultTableModel(new Object[][]{},new String[]{"To do","Date added", "Modify"});
table.setSize(450, 600);
table.setModel(tableModel);
JScrollPane scrlPan=new JScrollPane(table);
for(int i = 0; i < model.getId().size(); i++) {
tableModel.addRow(new Object[]{
model.getItem().get(i),
model.getDate().get(i),
model.getId().get(i)
});
}
add(scrlPan);
add(table.getTableHeader(), BorderLayout.NORTH);
add(table, BorderLayout.CENTER);
}
对于如何解决这个问题有什么想法吗?
-
不要重新发明轮子,搜索
ResultSetTableModel (few code workarounds)
或@camickr
的TableFromDatabase -
点。解决方法是
EDT sensitive
,JTables
内容等待ResultSet
返回所有行,Swing GUI
冻结或不负责Key & Mouse events
,直到长而硬的Object
(JDBC)完成,此逻辑可能适用于来自small DB tables
的小型ResultSets
,而无需打开&关闭Connection to Database
,否则必须使用SwingWorker
和Batch logics
(f.e.更新XxxTableModel with 20rows
)
下面的代码,直接从你的代码派生,对我来说没有问题:
JTable table = new JTable();
final DefaultTableModel model = new DefaultTableModel(
new Object[][] {}, new String[] { "To do", "Date added",
"Modify" });
table.setModel(model);
JFrame f = new JFrame();
f.getContentPane().add(table);
JButton b = new JButton("More ..");
f.getContentPane().add(b, BorderLayout.NORTH);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < 2; i++) {
model.addRow(new Object[] { "A" + i, "B" + i, "C" + i });
}
}
});
f.setSize(400, 400);
f.setVisible(true);
b.doClick();
简单地检查一下你的做法是否不同。我可能会怀疑的最后一件事—也许您直接从非Swing线程设置了新值。使用SwingUtilities。
从AbstractTableModel派生的模型需要在你的模型上调用继承方法fireTableCellUpdated。还有更多触发器来触发JTable注册的内容更改侦听器,以便在模型更改时更新自己。根据你的情况来使用。另一种可能对整个内容更改很好的方法是创建并设置整个新TableModel。但在你的情况下,这可能不相关,因为你使用DefaultTableModel:它已经实现了这个功能,它不需要repaint(), revalidate(), fireablexyz。一旦你设置了新的内容,它必须自己完成所有的事情。
将tableModel
作为类的一个字段,并在需要时更新它。不要重新创建table
对象