如何在JTable中更新DefaultTableModel的行?

时间:2012-06-21 23:37:28

标签: java swing jtable jframe

好的我已将此表添加到添加到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();
        }
    });

2 个答案:

答案 0 :(得分:4)

这里有几个问题:

  1. 看起来您需要在按下该按钮时更新整个表格。这里有三个选项:使用setDataVector更新DefaultTableModel,从头开始重新创建一个新模型并使用setModel在JTable上设置它,根据TableModel实现您自己的AbstractTableModel并触发适当的TableModel事件。您也可以使用addRowremoveRow更新模型,但这样会非常无效,因为它会触发很多事件。

  2. 要听&#34;按下按钮&#34;事件,而不是用户ActionListener(并使用addActionListener添加)或操作(并使用setAction设置)。

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

  4. 无关:请考虑关注Java coding conventions(类名称以大写字母开头)和有意义的变量名称。

答案 1 :(得分:1)

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

您从数据提供代码中获取Vector,然后使用新数据设置表格的行0 ... n。这样做的方法是编写一个custom extension of AbstractTableModel,返回按下按钮时所需的数据。

另一个问题是您按下按钮的方式。向按钮添加鼠标监听器绝对不是处理它的正确方法。您想要向该按钮添加ActionListener。只要按下并释放按钮,就会触发该监听器。