创建对JTable数据的持久引用

时间:2016-11-16 00:45:18

标签: java swing

我试图在IntelliJ中创建一个带有两列的JTable:一列是复选框,另一列是字符串。用户可以通过按JButton向表中添加任意字符串,每次按下该按钮时,新行将添加到表中,其中第一列是复选框,第二列是任意字符串。这可以进行任意次数向表中添加任意数量的行。通过单击复选框并按下删除按钮,该行将从表中删除。整个过程工作正常,但不是我遇到的麻烦。

每次用户按下向表中添加字符串的按钮时,我想将该字符串添加到一致的对象/容器中。所以在初始化时对象是空的,

Object[][] tableData;

但是当按下按钮时,对象现在包含"复选框"由布尔值和字符串表示。

Object[][] tableData = {
    {false, "String"}
}

这可能会持续一段时间。

Object[][] tableData = {
    {false, "String"},
    {false, "String"},
    {false, "String"},
    {false, "String"},
    {false, "String"},
    {false, "String"}
}

如果任何布尔值变为true(通过复选框),并按下删除按钮,那么该特定的"行"或部分对象被删除。我将如何创建此对象或容器并进行维护?没有对象,有更好的方法吗?

现在简单概述我现在的情况如下。

String colNames = {" ", "String"};
DefaultTableModel tableModel = new DefaultTableModel(colNames, 0);

importTable = new JTable(tableModel) {
    @Override
    public Class getColumnClass(int column) {
        switch(column) {
            case 0:
                return Boolean.class;
            default:
                return String.class;
        }
    }
};

importButton.addActionListener(new ActionListener() {
    public void actionPerofrmed(ActionEvent e) {
        Object[][] newData = {
            {false, "String"}
        };
        tableModel.addRow(newData[0]);
    }
});

removeButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        for (int i = 0; i < tableModel.getRowCount(); i++) {
            Boolean checked = (Boolean) tableModel.getValueAt(i, 0);
            if (checked) {
                tableModel.removeRow(i);
                i--;
            }
        }
    }
});

1 个答案:

答案 0 :(得分:1)

这不正是你的桌子模型的用途吗?如果您需要不同的数据&#34; nucleus&#34;对于你的表模型,一个说使用ArrayList<CustomType>,其中CustomType是一个包含Boolean和String的类,表示JTable中的每一行数据,然后扩展AbstractTableModel,给它上面的ArrayList,覆盖必要的方法,请务必在需要时调用相应的fireXxxx(...)方法,然后开展业务。

或者坚持使用DefaultTableModel,并编写代码以简单地将其转换为您需要的对象。

请注意,您的部分帖子让我感到困惑 - 您使用了不灵活且面向对象的2D对象阵列 - 为什么?