2012-06-21 49 views
3

好吧,我已经加入此表到一个JPanel添加到一个JFrame。如何更新JTable中的DefaultTableModel的行?

在事件的mousePressed那里它instates一类新的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

几个问题在这里:

  1. 它看起来像你需要在你按下那个按钮,更新整个表。您有三种选择:使用setDataVector更新DefaultTableModel,从头开始重新创建新模型并使用setModel将其设置在JTable上,根据AbstractTableModel实施您自己的TableModel并触发适当的TableModel事件。你也可以使用更新和addRowremoveRow模型,但是这将是非常uneffective,因为它会引发许多事件。

  2. 要收听“按钮按下”事件,而用户的ActionListener(并使用它addActionListener添加)或行动(以及setAction设置)。

  3. 在DefaultTableModel中,当您修改结构时,不需要手动调用fireTableDataChanged();。无论何时修改基础数据,它都会自动激发适当的TableModel事件。不要致电frame.repaint(),这是无用的,可能会很费时间。

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

1

您在这里编写的代码存在不少问题。首先,让我们解决您在mousePressed方法中使用代码时遇到的问题:

您将从数据提供代码中获取Vector,然后使用新数据设置表的第0 ... n行。做到这一点的方法是写一个custom extension of AbstractTableModel返回按下按钮,当你需要的数据。

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