2017-05-03 2 views
1

Ich habe zwei Tabellen, und ich versuche, die Daten aus einem Datensatz in einer Tabelle zu einer anderen Tabelle hinzuzufügen, wenn auf diesen Datensatz geklickt wird.Verwenden von FireTableDataChanged zum Aktualisieren von Tabellendaten

Derzeit, wenn ich auf die Tabelle klicke, werden die Werte zum clickedData hinzugefügt, aber diese Daten werden nicht in der Tabelle aktualisiert.

Hier ist mein Code:

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

Antwort

1

Da DefaultTableModelconvertToVector() intern verwendet, die Aktualisierung des clickedData Array verwendet model2 erstellen nicht den Inhalt des dataVector des Modells ändern. Als Ergebnis meldet fireTableDataChanged() das Abhören JTable, aber das Modell hat sich in der Zwischenzeit nicht geändert. Aktualisieren Sie stattdessen model2 über setValueAt(), wodurch das richtige Ereignis für Sie ausgelöst wird. Ein ähnliches Problem wird untersucht here.

Verwenden Sie auch eine ListSelectionListener anstelle einer MouseListener.

+1

Vielen Dank, das Problem wurde behoben –

Verwandte Themen