0

我有一个在其中使用 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);
}

关于如何解决这个问题的任何想法?

4

3 回答 3

1

tableModel作为类的一个字段,并在需要时对其进行更新。不要重新创建table对象。

于 2013-01-09T13:21:15.467 回答
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。设置新内容后,它必须自己完成所有操作。

于 2013-01-09T13:23:06.053 回答
1
  • 不要重新发明轮子,搜索ResultSetTableModel (few code workarounds)TableFromDatabase@camickr

  • 我的解决方法是EDT sensitiveJTables内容等到ResultSet返回所有行,Swing GUI冻结或不负责Key & Mouse events直到长时间和硬Object(JDBC)完成,这种逻辑可能适用于小型ResultSetsfrom small DB tables,没有打开和关闭Connection to Database,否则必须使用SwingWorkerand Batch logics(fe update XxxTableModel with 20rows)

于 2013-01-09T13:33:49.977 回答