3

好的,我已将此表添加到添加到 JFrame 的 JPanel 中。

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

我想要发生的事情,每次按下 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();
        }
    });
4

2 回答 2

4

这里有几个问题:

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

  2. 要侦听“按下按钮”事件,而不是用户ActionListener(并使用添加它addActionListener)或操作(并使用设置它setAction)。

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

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

于 2012-06-22T08:35:08.957 回答
1

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

您从提供代码的数据中获取向量,然后使用新数据设置表的第 0...n 行。这样做的方法是编写一个AbstractTableModel 的自定义扩展,当按下按钮时返回你需要的数据。

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

于 2012-06-22T00:04:07.070 回答