好的我已将此表添加到添加到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();
}
});
答案 0 :(得分:4)
这里有几个问题:
看起来您需要在按下该按钮时更新整个表格。这里有三个选项:使用setDataVector
更新DefaultTableModel,从头开始重新创建一个新模型并使用setModel
在JTable上设置它,根据TableModel
实现您自己的AbstractTableModel
并触发适当的TableModel事件。您也可以使用addRow
和removeRow
更新模型,但这样会非常无效,因为它会触发很多事件。
要听&#34;按下按钮&#34;事件,而不是用户ActionListener
(并使用addActionListener
添加)或操作(并使用setAction
设置)。
在DefaultTableModel中,修改结构时,不需要手动调用fireTableDataChanged();
。每当您修改基础数据时,它都会自动触发相应的TableModel事件。也不要打电话给frame.repaint()
,这是没用的,也很耗时。
无关:请考虑关注Java coding conventions(类名称以大写字母开头)和有意义的变量名称。
答案 1 :(得分:1)
您在此处编写的代码存在很多问题。首先,让我们用mousePressed方法中的代码解决您遇到的问题:
您从数据提供代码中获取Vector,然后使用新数据设置表格的行0 ... n。这样做的方法是编写一个custom extension of AbstractTableModel,返回按下按钮时所需的数据。
另一个问题是您按下按钮的方式。向按钮添加鼠标监听器绝对不是处理它的正确方法。您想要向该按钮添加ActionListener。只要按下并释放按钮,就会触发该监听器。