2017-05-13 6 views
0

EventYearMatchingWindowのJTableのチェックボックスをクリックすると、EventYearMatchingUnitPanelクラスのJTableのすべてのチェックボックスを自動的に選択します。Java:別のチェックボックスをクリックしたときにJTableのチェックボックスを自動的に更新する

最初のピクチャ(https://ibb.co/fsqtrQ)の「ユニット9」チェックボックスをクリックすると、自動的に第二の画像にすべての5つのチェックボックスを選択する必要があり(https://ibb.co/f8ja5k

私はチェックボックスがあるかどうかを検出するTabelModelListenerにまた、tableChanged()メソッドを使用クリックしたチェックボックスをクリックすると、他のチェックボックスの値がBoolean.FALSEからBoolean.TRUEに変更されますが、チェックボックスは更新されません(物理的にチェックマークが表示されません)。

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

そして:

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

は、ここでは、コードの大きな絵だ

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

あなたがコンパイルされないでしょう掲示コードの小さな、不完全なスニペット。問題を再現した最小限の完全な例を投稿してください。 –

+0

ありがとう、私はコード全体を更新しました。 –

+1

[mcve]には「最小」があり、これは「コード全体」の反対です。ちょうどFYI。 – user1803551

答えて

0

が、チェックボックスは、(物理的にチェックマークを表示しない)更新されません。

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

、これまでのデータ配列にアクセスしないでください。データ配列はDefaultTableModelを作成するために使用され、データはArrayからDefaultTableModel(Vectorのベクターになる)によって使用されるデータ構造にコピーされます。

最終的にTableModelのデータは変更されません。

コードは次のようになります。

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

ありがとうございました! –

関連する問題