更新内容时重新创建JTable

时间:2013-01-09 13:16:12

标签: java swing jdbc jtable tablemodel

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

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

3 个答案:

答案 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)

  • 制作的@camickrTableFromDatabase
  • A.M。解决方法是EDT sensitiveJTables内容等待ResultSet返回所有行,Swing GUI冻结或不负责Key & Mouse events,直到漫长而艰难Object (JDBC)完成后,这个逻辑可能适用于来自ResultSets的小small DB tables,而不是开放&amp;关闭Connection to Database,否则必须使用SwingWorkerBatch logics(f.e。更新XxxTableModel with 20rows