在我的JTable

时间:2015-07-20 11:16:07

标签: java swing jtable jcheckbox

我有一个包含JCheckBox类型元素的表模型。我希望这个表的内容根据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();
    }
}

1 个答案:

答案 0 :(得分:1)

Boolean中管理TableMode类型的元素,以获取默认renderer and editor

  

我已尝试使用布尔值,但无法切换渲染的复选框。

TableMode的实施似乎延伸AbstractTableModel;确保相关列发生以下情况:

  • Boolean.class返回getColumnClass()

  • true返回isCellEditable()

  • 在更新内部TableModelEvent时触发setValueAt()中相应的Map<…>

使用AbstractTableModel的完整示例显示为herehere。检查向列中添加多个组件的示例here