2015-07-20 54 views
2

我有一個包含JCheckBox類型元素的表模型。我希望此表的內容根據JComboBox的值而不同。當我的JTable觸發更改時,最後的JCheckBox保持切換狀態

我的問題如下:如果我切換一些複選框,然後更改我的組合框的值,所有複選框採用默認值(這是我想要的,因爲布爾值是所選JCheckBox中的項目),除了在更改組合框的值之前切換的最後一個項目。

這裏是我是如何實現這一點:

public class ValsSelectionTableModel extends MyAbstractTableModel { 

    private final JComboBox<Data> dataField; 
    private final Map<Data, JCheckBox[][]> modifiedVals = new HashMap<>(); 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     Data data = (Data) dataField.getSelectedItem(); 
     if (!modifiedVals.containsKey(data)) 
      modifiedVals.put(data, 
       buildCheckBoxesFrom(ClassWithStaticFields.defaultBoolArray)); 
     return modifiedVals.get(data)[rowIndex][columnIndex]; 
    } 

    private JCheckBox[][] buildCheckBoxesFrom(boolean[][] boolArray) { 
     JCheckBox[][] checkBoxArray = 
      new JCheckBox[boolArray.length][boolArray[0].length]; 
     for (int i = 0 ; i < checkBoxArray.length ; i++) 
      for (int j = 0 ; j < checkBoxArray[i].length ; j++) { 
       checkBoxArray[i][j] = new JCheckBox(); 
       checkBoxArray[i][j].setSelected(boolArray[i][j]); 
       checkBoxArray[i][j].setHorizontalAlignment(SwingConstants.CENTER); 
      } 
     return checkBoxArray; 
    } 
} 

有沒有人有一個想法有什麼錯呢?

編輯:我忘記一些重要的事情(否則JComboBox的選擇不會改變顯示器):我加入這個ActionListener添加到我的JComboBox:

public class MyListener implements ActionListener { 

    private final ValsSelectionTableModel tableModel; 

    public MyListener(ValsSelectionTableModel tableModel) { 
     this.tableModel = tableModel; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     tableModel.fireTableDataChanged(); 
    } 
} 
+2

在'TableModel'中管理'Boolean'類型的元素以獲取默認[編輯器/渲染器](https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)。 – trashgod

+0

@trashgod其實我已經試過布爾,但是呈現的複選框不能切換。我是否必須將該表的默認編輯器設置爲布爾值? – Paco

回答

1

管理Boolean類型的元素在你的TableMode獲得默認renderer and editor

我已經嘗試過使用布爾值,但是呈現的複選框無法切換。

您的TableMode的實施似乎延伸AbstractTableModel;確保以下事情發生的相關列:

  • 返回Boolean.classgetColumnClass()

  • 返回trueisCellEditable()

  • 當更新您的內部Map<…>時,在setValueAt()中觸發適當的TableModelEvent。使用AbstractTableModel

完整實例參見herehere。將一個列添加多個組件的示例將被檢查here

+0

工作得很好,我錯過了'setValueAt()',我不知道它是否存在,因爲我不必將它用於其他表格。 非常感謝!但是我仍然無法看到我的原始代碼中發生了什麼(使用JCheckBox)。 – Paco

+0

@Paco:很高興你能工作;如果'getColumnClass()'返回'Boolean.class',默認情況下你會得到一個'JCheckBox'作爲渲染器。 – trashgod

相關問題