更新内容时重新创建JTable



我有一个在其中使用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,否则必须使用SwingWorkerBatch 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对象

最新更新