2010-02-14 23 views
1

我正在尝试为我的JTable创建自己的自定义TableModel(因为我想将JCheckBox的一行合并到我的表中)。 JScrollPane也是如此。在我试图合并JCheckBox和自定义AbstractTableModel之前,如果我使用默认(Object [] [],Object [])构造函数,则JTable将显示正常。我在Sun的JTable教程中读到,那些构造函数使用默认方式将所有数据视为字符串。获取带有自定义表模型的JTable以显示在JScrollPane中

然后我创建我的自定义AbstractTableModel上,并从这个去:

JTable table = new JTable(dataArray, col); 

这样:

JTable table = new JTable(); 

我假定这将呼叫尝试与定制类创建的JTable它扩展了AbstractTableModel,但现在没有在JScrollPane中显示出来。

我用错了吗?我几乎从Sun教程拷贝了代码,只改变了涉及的数据文件的名称。我也把这个方法放在同一个类中。有没有其他方法来确保您的表格是使用您的自定义表格模型创建的?任何见解将不胜感激。

回答

1

JTable有几个构造函数以TableModel作为参数。那是你在找什么?从您提供的代码片段看来,您似乎在调用默认构造函数,并期望它以某种方式使用您的自定义表模型。 (也许有一些代码丢失了吗?)。如果使用默认构造函数,JTable将在内部创建一个DefaultTableModel实例并使用它。

编辑: 评论不采取代码非常好,所以在这里加入:要获得使用模型中的表,你会做这样的事情:

MyTableModel model = new MyTableModel(); 
// ...initialise model if required 
JTable table = new JTable(model); 
+0

我想这就是我所困惑的。 Sun网页上的JTable信息指出: 有两个直接接受数据的JTable构造函数(SimpleTableDemo使用第一个): JTable(Object [] [] rowData,Object [] columnNames) JTable(Vector rowData, Vector columnNames) 然后它声明: 这些构造函数的优点是它们易于使用。但是,这些构造函数也有缺点: 它们将所有数据类型视为相同(如字符串)。 – MarcZero 2010-02-14 01:37:24

+0

所以阅读,我的印象是,我必须创建一个扩展AbstractTableModel的自定义类,并且不知何故,我创建的表将使用它而不是默认的构造函数。如果我使用JTable(Object [] [],Object [])构造函数,它将每个单元格视为字符串,因此我“假设”调用没有构造函数的方法:JTable()将使用我创建的自定义单元格,但我的屏幕现在是空白的。我可以回到默认的构造函数,它显示得很好,但我似乎无法让它使用我的自定义表模型。 – MarcZero 2010-02-14 01:37:44

+0

@MarcZero:查看我答案中的编辑。 (如果没有意义,可能会发布一些更多的代码,我觉得这种感觉可能会在你想要做的事情中错过某些东西......) – Ash 2010-02-14 02:02:43

0

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

class MyTableModel extends AbstractTableModel { 
//code here 
} 

你需要初始化它在JTable构造是这样的:

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

所以你不能让它空白,并期望它能够“找到”新AbstractTableModel类。

1

正如您所观察到的,Ash在构造函数JTable中传递您的数据模型是正确的。如果您的模型的getColumnClass()返回Boolean.class,您将看到一个复选框呈现器by default。您可能会喜欢这个使用自定义渲染器和编辑器的example

0

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

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

这会告诉您如何呈现每个单元格。如果你不重写这个,它只会显示为一个字符串。

相关问题