2017-05-03 426 views
1

我有两个表,我试图将数据从一个表中的记录添加到另一个表,当该记录被点击。使用fireTableDataChanged更新表格数据

当前当我点击表格时,这些值会被添加到clickedData中,但是这些数据不会在表格中刷新。

这里是我的代码:

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); 
    } 
    } 

回答

1

因为DefaultTableModel使用convertToVector()内部,更新用于创建model2不会改变模型的dataVector内容的clickedData阵列。因此,fireTableDataChanged()通知收听JTable,但该模型在此期间没有改变。相反,请通过setValueAt()更新model2,这会为您启动正确的事件。类似的问题进行了检查here

也可以考虑使用ListSelectionListener而不是MouseListener

+1

谢谢你,这解决了这个问题 –