如何在JTable中更新DefaultTableModel的行?

How to update the rows of a DefaultTableModel in a JTable?

提问人:Aaron 提问时间:6/22/2012 最后编辑:mKorbelAaron 更新时间:6/22/2012 访问量:10600

问:

好的,我把这个表添加到一个 JPanel 中,添加到一个 JFrame。

在 mousePressed 事件中,它指定一个新类 tData,并调用一个方法,该方法将数据库中的数据作为包含在 vector 元素中的字符串返回。

我想发生的是,每次按下 btn 时,它都会更新表格,

每次按下 btn 时,它都会更新表,但将相同的数据添加到表的末尾,会发生什么?

是什么原因导致了这种情况的发生?

    Object columnHeaders[] = {"Fname", "Mname", "Lname", "Age"};
    Object data[][] = {{}};
    final DefaultTableModel dtm = new DefaultTableModel(data, columnHeaders);

    JTable tb = new JTable(dtm);
    JScrollPane scrollPane = new JScrollPane(tb);

    tableWrap.add(scrollPane);

    btn.addMouseListener(new MouseAdapter() {

        @Override 
        public void mousePressed(MouseEvent arg0) {
            tData h = new tData(10));
            Vector<String> v = h.getInfo();
            for(int i = 0; i < v.size() ; i++) {
                dtm.insertRow(i, new Object[]{v.get(i).split(",")[0], v.get(i).split(",")[1], v.get(i).split(",")[2], v.get(i).split(",")[3]});
            }

            dtm.fireTableDataChanged();
            frame.repaint();
        }
    });
java swing jtable jframe

评论


答:

1赞 Scott Faria 6/22/2012 #1

您在此处编写的代码存在很多问题。首先,让我们解决 mousePressed 方法中的代码问题:

您将从提供代码的数据中获取一个 Vector,然后使用新数据设置表的第 0...n 行。执行此操作的方法是编写 AbstractTableModel 的自定义扩展,该扩展在按下按钮时返回所需的数据。

另一个问题是您处理按钮按下的方式。将鼠标侦听器添加到按钮绝对不是处理该问题的正确方法。您想要将 ActionListener 添加到按钮。每当按下和释放按钮时,该侦听器都会被触发。

4赞 Guillaume Polet 6/22/2012 #2

这里有几个问题:

  1. 每当按下该按钮时,您似乎都需要更新整个表格。这里有三个选项:使用 更新 DefaultTableModel,从头开始重新创建一个新模型,并在 JTable 上设置它,基于并触发适当的 TableModel 事件实现您自己的模型并触发适当的 TableModel 事件。您也可以使用 和 更新模型,但这将非常无效,因为它会触发许多事件。setDataVectorsetModelTableModelAbstractTableModeladdRowremoveRow

  2. 要侦听“按钮按下”事件,请用户 an(并使用 )或 Action(并使用 设置它)。ActionListeneraddActionListenersetAction

  3. 在 DefaultTableModel 中,修改结构时,不需要手动调用 。每当您修改基础数据时,它都会自动触发相应的 TableModel 事件。也不要打电话,这是无用的,而且可能很耗时。fireTableDataChanged();frame.repaint()

  4. 不相关:考虑遵循 Java 编码约定(类名以大写字母开头)和有意义的变量名称。