使用 fireTableDataChanged 更新 Table 数据
Using fireTableDataChanged to Update Table Data
我有两个 table,我试图在单击该记录时将数据从一个 table 中的记录添加到另一个 table。
目前,当我点击 table 时,值会添加到 clickedData 但此数据不会在 table 中刷新。
这是我的代码:
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.*;
class TableTest extends JPanel {
JTable tbl1, tbl2;
GridBagConstraints gc = new GridBagConstraints();
public TableTest(){
this.setLayout(new GridBagLayout());
gc.insets = new Insets(10, 10, 10, 30);
Object[][] data = new Object[100][2];
Object[][] clickedData = new Object[100][2];
String[] columnNames = {"X", "Y"};
//Initialise tables
tbl1 = new JTable(data,columnNames);
DefaultTableModel model = new DefaultTableModel(data, columnNames);
DefaultTableModel myModel = new DefaultTableModel(data,columnNames){
public boolean isCellEditable(int row, int column){
return false;
}
};
tbl1.setModel(myModel);
DefaultTableModel model2 = new DefaultTableModel(clickedData,columnNames);
tbl2 = new JTable(model2);
DefaultTableModel myModel2 = new DefaultTableModel(clickedData,columnNames){
public boolean isCellEditable(int row, int column){
return false;
}
};
//Update Table Data
tbl1.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
int row = tbl1.rowAtPoint(evt.getPoint());
int col = tbl1.columnAtPoint(evt.getPoint());
//basket[0] = row;
clickedData[0][0] = tbl1.getValueAt(row,col);
clickedData[0][1] = tbl1.getValueAt(row,col+1);
//use fireTableDatachanged
model2.fireTableDataChanged();
}
});
initLayout(0,0,tbl1);
initLayout(3,0,tbl2);
}
public void initLayout(int xlayout, int ylayout, JComponent component){
gc.gridx = xlayout;
gc.gridy = ylayout;
this.add(component,gc);
}
}
因为DefaultTableModel
uses convertToVector()
internally, updating the clickedData
array used to create model2
does not change the content of the model's dataVector
. As a result, fireTableDataChanged()
notifies the listening JTable
, but the model has not changed in the interim. Instead, update model2
via setValueAt()
, which will fire the correct event for you. A similar problem is examined here.
也可以考虑使用 ListSelectionListener
而不是 MouseListener
。
我有两个 table,我试图在单击该记录时将数据从一个 table 中的记录添加到另一个 table。
目前,当我点击 table 时,值会添加到 clickedData 但此数据不会在 table 中刷新。
这是我的代码:
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.*;
class TableTest extends JPanel {
JTable tbl1, tbl2;
GridBagConstraints gc = new GridBagConstraints();
public TableTest(){
this.setLayout(new GridBagLayout());
gc.insets = new Insets(10, 10, 10, 30);
Object[][] data = new Object[100][2];
Object[][] clickedData = new Object[100][2];
String[] columnNames = {"X", "Y"};
//Initialise tables
tbl1 = new JTable(data,columnNames);
DefaultTableModel model = new DefaultTableModel(data, columnNames);
DefaultTableModel myModel = new DefaultTableModel(data,columnNames){
public boolean isCellEditable(int row, int column){
return false;
}
};
tbl1.setModel(myModel);
DefaultTableModel model2 = new DefaultTableModel(clickedData,columnNames);
tbl2 = new JTable(model2);
DefaultTableModel myModel2 = new DefaultTableModel(clickedData,columnNames){
public boolean isCellEditable(int row, int column){
return false;
}
};
//Update Table Data
tbl1.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
int row = tbl1.rowAtPoint(evt.getPoint());
int col = tbl1.columnAtPoint(evt.getPoint());
//basket[0] = row;
clickedData[0][0] = tbl1.getValueAt(row,col);
clickedData[0][1] = tbl1.getValueAt(row,col+1);
//use fireTableDatachanged
model2.fireTableDataChanged();
}
});
initLayout(0,0,tbl1);
initLayout(3,0,tbl2);
}
public void initLayout(int xlayout, int ylayout, JComponent component){
gc.gridx = xlayout;
gc.gridy = ylayout;
this.add(component,gc);
}
}
因为DefaultTableModel
uses convertToVector()
internally, updating the clickedData
array used to create model2
does not change the content of the model's dataVector
. As a result, fireTableDataChanged()
notifies the listening JTable
, but the model has not changed in the interim. Instead, update model2
via setValueAt()
, which will fire the correct event for you. A similar problem is examined here.
也可以考虑使用 ListSelectionListener
而不是 MouseListener
。