在我的 JTable 中触发更改时,最后一个 JCheckBox 保持切换状态
Last JCheckBox stays toggled when firing changes in my JTable
我有一个 table 模型,其中包含 JCheckBox 类型的元素。我希望这个 table 的内容根据 JComboBox 的值而有所不同。
我的问题如下:如果我切换几个复选框然后更改组合框的值,所有复选框都采用默认值(这就是我想要的,因为布尔值是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();
}
}
在您的 TableMode
中管理 Boolean
类型的元素以获得默认的 renderer and editor。
I already tried with Boolean, but the rendered checkboxes cannot be toggled.
您对 TableMode
的实施似乎扩展了 AbstractTableModel
;确保相关列发生以下情况:
Return Boolean.class
来自 getColumnClass()
.
Return true
来自 isCellEditable()
.
在更新内部 Map<…>
时在 setValueAt()
中触发适当的 TableModelEvent
。
已查看使用 AbstractTableModel
的完整示例 here and here. An example of adding multiple components to a column is examined here。
我有一个 table 模型,其中包含 JCheckBox 类型的元素。我希望这个 table 的内容根据 JComboBox 的值而有所不同。
我的问题如下:如果我切换几个复选框然后更改组合框的值,所有复选框都采用默认值(这就是我想要的,因为布尔值是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();
}
}
在您的 TableMode
中管理 Boolean
类型的元素以获得默认的 renderer and editor。
I already tried with Boolean, but the rendered checkboxes cannot be toggled.
您对 TableMode
的实施似乎扩展了 AbstractTableModel
;确保相关列发生以下情况:
Return
Boolean.class
来自getColumnClass()
.Return
true
来自isCellEditable()
.在更新内部
Map<…>
时在setValueAt()
中触发适当的TableModelEvent
。
已查看使用 AbstractTableModel
的完整示例 here and here. An example of adding multiple components to a column is examined here。