我正在尝试在 IntelliJ 中创建一个包含两列的 JTable:一列是复选框,另一列是字符串。用户可以通过按 JButton 将任意字符串添加到表中,每次按下按钮时,都会向表中添加一个新行,其中第一列是复选框,第二列是任意字符串。可以执行任意次数,向表中添加任意数量的行。通过单击复选框并按删除按钮,该行将从表中删除。整个过程工作正常,但不是我遇到的问题。
每次用户按下向表中添加字符串的按钮时,我都想将该字符串添加到一致的对象/容器中。所以在初始化时对象是空的,
Object[][] tableData;
但是当按下按钮时,对象现在包含由 boolean 值表示的“复选框”和字符串。
Object[][] tableData = {
{false, "String"}
}
这可能会持续一段时间。
Object[][] tableData = {
{false, "String"},
{false, "String"},
{false, "String"},
{false, "String"},
{false, "String"},
{false, "String"}
}
如果任何 boolean 值更改为 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--;
}
}
}
});
最佳答案
这不正是您的表格模型的用途吗?如果您的表模型需要不同的数据“核心”,则可以使用 ArrayList<CustomType>
其中 CustomType 是一个类,它包含一个 boolean 值和一个字符串,代表 JTable 中的每一行数据,然后扩展 AbstractTableModel,给它上面的 ArrayList,覆盖必要的方法,请务必调用适当的 fireXxxx(...)
需要时使用方法,然后您就可以开始工作了。
或者坚持使用 DefaultTableModel,并编写代码以简单地将其转换为您需要的对象或从您需要的对象进行转换。
请注意,您的帖子的一部分让我感到困惑 - 您使用了不灵活且面向对象的破坏性 2D 对象数组 - 为什么?
关于java - 创建对 JTable 数据的持久引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40622248/