2017-05-13 2 views
0

Ich möchte, dass jedes Kontrollkästchen in der JTable in der EventYearMatchingUnitPanel-Klasse automatisch ausgewählt wird, wenn auf ein Kontrollkästchen in der JTable in EventYearMatchingWindow geklickt wird.Java: Automatisches Aktualisieren eines Kontrollkästchens in JTable, wenn ein anderes Kontrollkästchen angeklickt wird

„Einheit 9“ Kontrollkästchen in dem ersten Bild klicken (https://ibb.co/fsqtrQ) automatisch alle 5 Kontrollkästchen in dem zweiten Bild ausgewählt (https://ibb.co/f8ja5k)

verwenden ich die tableChanged() Methode in TabelModelListener zu erkennen, ob ein Kontrollkästchen ist, geklickt. Wenn ich das Kontrollkästchen anklicke, ändert sich der Wert der anderen Kontrollkästchen (von Boolean.FALSE zu Boolean.TRUE), aber die Kontrollkästchen werden nicht aktualisiert (die Kontrollkästchen werden nicht physisch angezeigt).

//for the first JTable 
public void tableChanged(TableModelEvent e){ 
    int row = e.getFirstRow(); 
    int column = e.getColumn(); 
    TableModel model = (TableModel)e.getSource(); 
    String columnName = model.getColumnName(column); 
    Object thatValue = model.getValueAt(row, column); 
    data[row][column] = thatValue; 
    for(int i = 0; i < unitPanels[row].getNumRows(); i++){ 
     unitPanels[row].setToSelectedState(i); 
    } 
} 

//for the second JTable 
public void setToSelectedState(int row){  
    data[row][0] = Boolean.TRUE; 
    model.fireTableCellUpdated(row, 0); 
} 

hier ein vergrößertes Bild des Code:

public class EventYearMatchingWindow extends JFrame implements 
TableModelListener 
{ 
    private boolean columnHeaderClicked; 
    private ArrayList<Category> categories; 
    private JPanel mainPanel, listPanel, buttonPanel; 
    private ArrayList<Item> selectedItems; 
    private EventYearMatchingItemChoosing[] unitPanels; 
    Object data[][]; 
    public EventYearMatchingWindow(ArrayList<Category> c){ 
     ... 
     String[] columnNames = {"Include?", ""}; 
     data = new Object[6][2]; 
     for(int i = 0; i < 6; i++){ 
      data[i][0] = Boolean.FALSE; 
      data[i][1] = "Unit " + (i+8); 
     } 
     DefaultTableModel model = new DefaultTableModel(data, columnNames) { 
      private static final long serialVersionUID = 1L; 
      @Override 
      public Class getColumnClass(int columnIndex) { 
       if (columnIndex == 0){ 
        return Boolean.class; 
       } 
       return super.getColumnClass(columnIndex); 
      } 
     }; 

     JTable table = new JTable(model); 
     table.getModel().addTableModelListener(this); 
     table.addMouseListener(new java.awt.event.MouseAdapter() { 
     .... 
      @Override 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
       int row = table.rowAtPoint(evt.getPoint()); 
       int col = table.columnAtPoint(evt.getPoint()); 
       if (row == -1 && col >= 0){ 
        columnHeaderClicked = true; 
       } 
       if (row >= 0 && col == 1 && !columnHeaderClicked) { 
        mainPanel.removeAll(); 

        System.out.println(unitPanels[row].getData()[0][0]); 
        unitPanels[row].revalidate(); 
        unitPanels[row].repaint(); 

        mainPanel.add(unitPanels[row]); 
        JPanel nButtonPanel = new JPanel(); 
        Button back = new Button("Back"); 
        nButtonPanel.add(back); 
        back.addActionListener(new ActionListener(){ 
         public void actionPerformed(ActionEvent e){ 
          mainPanel.removeAll(); 
          mainPanel.add(listPanel); 
          mainPanel.add(buttonPanel); 
          mainPanel.revalidate(); 
          repaint(); 
         } 
        }); 
        mainPanel.add(nButtonPanel); 
        mainPanel.revalidate(); 
        repaint(); 
       } 
      } 
     }); 
    } 
    public void tableChanged(TableModelEvent e){ 
     int row = e.getFirstRow(); 
     int column = e.getColumn(); 
     TableModel model = (TableModel)e.getSource(); 
     String columnName = model.getColumnName(column); 
     Object thatValue = model.getValueAt(row, column); 
     data[row][column] = thatValue; 
     for(int i = 0; i < unitPanels[row].getNumRows(); i++){ 
      unitPanels[row].setToSelectedState(i); 
     } 
    } 
} 

Und:

public class EventYearMatchingItemChoosing extends JPanel implements TableModelListener 
{ 
    Category category; 
    private boolean columnHeaderClicked; 
    private int size; 
    private ArrayList<Item> items; 
    private Object[][] data; 
    DefaultTableModel model; 
    public EventYearMatchingItemChoosing(String s, ArrayList<Category> c){ 
     ... 
     String[] columnNames = {"Include?", "Event", "Year"}; 
     data = new Object[size][3] 
     for(int i = 0; i < category.getItems().size(); i++){ 
      if(!category.getItems().get(i).getEvent().equals("") && !category.getItems().get(i).getYear().equals("")){ 
       data[i][0] = Boolean.FALSE; 
       data[i][1] = category.getItems().get(i).getEvent();    
       data[i][2] = category.getItems().get(i).getYear(); 
      } 
     }  

     model = new DefaultTableModel(data, columnNames) { 
      private static final long serialVersionUID = 1L; 
      @Override 
      public Class getColumnClass(int columnIndex) { 
       if (columnIndex == 0){ 
        return Boolean.class; 
       } 
       return super.getColumnClass(columnIndex); 
      }  
     }; 
     JTable table = new JTable(model); 
     table.getModel().addTableModelListener(this); 
     ... 
    } 
    ... 
    public void tableChanged(TableModelEvent e){ 
     int row = e.getFirstRow(); 
     int column = e.getColumn(); 
     TableModel model = (TableModel)e.getSource(); 
     String columnName = model.getColumnName(column); 
     Object thatValue = model.getValueAt(row, column); 
     data[row][column] = thatValue; 
    } 
    public void setToSelectedState(int row){  
     data[row][0] = Boolean.TRUE; 
     model.fireTableCellUpdated(row, 0); 
    } 
} 
+2

Der kleine, unvollständige Code-Snippet nicht kompiliert geschrieben würde. Poste ein minimales, vollständiges Beispiel, das das Problem reproduziert. –

+0

Danke, ich habe es mit dem gesamten Code aktualisiert. –

+1

[mcve] hat "Minimal" drin, was das Gegenteil von "ganzem Code" ist. Nur zu deiner Information. – user1803551

Antwort

0

aber die Kontrollkästchen nicht aktualisieren (nicht zeigen, physisch die Häkchen).

data[row][0] = Boolean.TRUE; 

Greifen Sie nicht immer die Daten Array. Das Daten-Array wird verwendet, um das DefaultTableModel zu erstellen, und dann werden die Daten von dem Array in die Datenstruktur kopiert, die von dem DefaultTableModel (das zufällig ein Vektor von Vektoren ist) verwendet wird.

Das Endergebnis ist, dass die Daten im TableModel nie geändert werden.

sollte der Code sein:

model.setValueAt(Boolean.TRUE, row, 0); 
+0

dank, es hat funktioniert! –

Verwandte Themen