我有一个使用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);
}
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
制作班级的tableModel
字段,并在需要时进行更新。不要重新创建table
对象。
答案 1 :(得分:1)
以下代码直接来自您的代码,对我来说没有问题:
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.invokeLater设置值。
从AbstractTableModel派生的模型需要在模型上调用继承的方法fireTableCellUpdated。还有更多触发器可以触发JTable注册的内容更改侦听器,以便在模型更改时自行更新。使用适合您的情况。可能有利于完整内容更改的另一种方法是创建和设置全新的TableModel。但是在你的情况下,这可能与你使用DefaultTableModel无关:它已经实现了这个功能,它不需要repaint(),revalidate(),fireTableXYZ。设置新内容后,它必须自行完成所有操作。
答案 2 :(得分:1)
不要重新发明轮子,搜索由ResultSetTableModel (few code workarounds)
@camickr
或TableFromDatabase
A.M。解决方法是EDT sensitive
,JTables
内容等待ResultSet
返回所有行,Swing GUI
冻结或不负责Key & Mouse events
,直到漫长而艰难Object
(JDBC)完成后,这个逻辑可能适用于来自ResultSets
的小small DB tables
,而不是开放&amp;关闭Connection to Database
,否则必须使用SwingWorker
和Batch logics
(f.e。更新XxxTableModel with 20rows
)