我有一個包含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();
}
}
在'TableModel'中管理'Boolean'類型的元素以獲取默認[編輯器/渲染器](https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)。 – trashgod
@trashgod其實我已經試過布爾,但是呈現的複選框不能切換。我是否必須將該表的默認編輯器設置爲布爾值? – Paco