1

我正在尝试为我的 JTable 创建自己的自定义 TableModel(因为我想将一行 JCheckBox 合并到我的表中。)我在 JScrollPane 中也有 JTable。在我尝试合并 JCheckBox 和自定义 AbstractTableModel 之前,如果我使用默认的 (Object[][], Object[]) 构造函数,JTable 会显示得很好。我在 Sun 的 JTable 教程中读到,这些构造函数默认使用将所有数据视为字符串的默认设置。

然后我创建了我的自定义 AbstractTableModel 并从此开始:

JTable table = new JTable(dataArray, col);

对此:

JTable table = new JTable();

我假设这将调用尝试使用扩展 AbstractTableModel 的定制类创建 JTable,但现在 JScrollPane 中没有显示任何内容。

我使用不正确?我实际上是从 Sun 教程中复制了代码,并且只更改了所涉及的数据文件的名称。我也把这个方法放在同一个类中。是否有其他方法可以确保您的表格是使用自定义表格模型创建的?任何见解将不胜感激。

4

4 回答 4

1

JTable有几个以 aTableModel作为参数的构造函数。那是你要找的吗?从您提供的代码片段中,您似乎正在调用默认构造函数并期望它以某种方式使用您的自定义表模型。(也许缺少一些代码可以做到这一点?)。如果您使用默认构造函数,JTable将在内部创建一个DefaultTableModel实例并使用它。

编辑: 评论不能很好地接受代码,所以在这里添加:为了让表格使用你的模型,你会做这样的事情:

MyTableModel model = new MyTableModel();
// ...initialise model if required
JTable table = new JTable(model);
于 2010-02-14T01:31:45.437 回答
1

正如您所观察到的,Ash 关于在JTable构造函数中传递您的数据模型是正确的。如果您的模型getColumnClass()返回,默认情况下Boolean.class您将获得一个复选框渲染器。您可能会喜欢这个说明使用自定义渲染器和编辑器的示例。

于 2010-02-14T02:23:23.380 回答
0

好的。在查看了我的代码后,我意识到如果我遗漏了任何构造函数,它将找不到指向您的自定义表模型的链接。所以,如果你创建了这个类:

class MyTableModel extends AbstractTableModel {
//code here
}

您需要像这样在 JTable 构造函数中实例化它:

JTable table = new JTable(new MyTableModel());

因此,您不能只将其留空并期望它“找到”新的 AbstractTableModel 类。

于 2010-02-14T02:16:02.967 回答
0

您需要扩展AbstractTableModel,并将其作为 JTable 构造函数的参数传递。(正如马克所做的那样)。除了所需的方法之外,您还需要定义此方法以显示实际的复选框:

 public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

这告诉您 JTable 如何呈现每个单元格。如果您不覆盖它,它将仅显示为字符串。

于 2010-02-14T02:24:18.137 回答