我正在尝试为我的JTable创建自己的自定义TableModel(因为我想将一行JCheckBox合并到我的表中。)我在JScrollPane中也有JTable。在我尝试合并JCheckBox和自定义AbstractTableModel之前,如果我使用默认的(Object [] [],Object [])构造函数,JTable会显示正常。我在Sun的JTable教程中读到这些构造函数使用默认情况将所有数据视为字符串。
然后我创建了我的自定义AbstractTableModel并从此开始:
JTable table = new JTable(dataArray, col);
To This:
JTable table = new JTable();
我假设这会调用尝试使用扩展AbstractTableModel的自定义类创建JTable,但现在JScrollPane中没有显示任何内容。
我使用不正确?我几乎从Sun教程中复制了代码,只更改了所涉及的数据文件的名称。我也把这个方法放在同一个类中。有没有不同的方法来确保您的表是使用自定义表模型创建的?任何见解都会受到赞赏
答案 0 :(得分:1)
JTable
有几个构造函数,它们以TableModel
作为参数。这就是你要找的东西吗?从您提供的代码片段中,您似乎正在调用默认构造函数并期望它以某种方式使用您的自定义表模型。 (也许有一些代码缺少这样做?)。如果您使用默认构造函数,JTable
将在内部创建DefaultTableModel
实例并使用它。
修改: 注释不会很好地使用代码,因此在此处添加:要使表格使用您的模型,您可以执行以下操作:
MyTableModel model = new MyTableModel();
// ...initialise model if required
JTable table = new JTable(model);
答案 1 :(得分:1)
正如您所观察到的,Ash正确地将您的数据模型传递到JTable
构造函数中。如果您的模型getColumnClass()
返回Boolean.class
,您将获得一个复选框渲染器by default。您可能希望此example说明使用自定义渲染器和编辑器。
答案 2 :(得分:0)
行。在查看我的代码后,我意识到如果我遗漏任何构造函数,它将找不到自定义表模型的链接。所以,如果你创建了这个类:
class MyTableModel extends AbstractTableModel {
//code here
}
您需要在JTable构造函数中实例化它,如下所示:
JTable table = new JTable(new MyTableModel());
所以你不能把它留空并期望它“找到”新的AbstractTableModel类。
答案 3 :(得分:0)
您需要扩展AbstractTableModel
,并将其作为JTable构造函数的参数传递。 (正如马克所做的那样)。除了必需的方法之外,您还需要定义此方法以显示实际的复选框:
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
这告诉你JTable如何渲染每个单元格。如果你不重写它,它将只显示为一个字符串。