我创建了自己的类,名为
CustomTableModel
,它扩展自 DefaultTableModel。
public class CustomTableModel extends DefaultTableModel {/*[...]*/}
我的计划是,当您使用
new CustomTableModel();
调用我的构造函数时,您会得到一个使用列名称和列类预初始化的新 CustomTableModel
。
我运行了类似的东西,但当前的实现曾经来自 Eclipse AWT(Window Builder),您还可以使用 GUI 来设置 TableModel。当前的实现如下所示:
public static DefaultTableModel createEmptyModel() {
model = new DefaultTableModel(new Object[][]{},
new String[]{"Lfd. Nr.", "FB Nr.", "Auftr. / Meld. Nr.", "Betra Nr.", "Datum", "Bahnhof", "Str. Km.",
"Sprz.", "Arb. Zeit", "Mitarbeiter", "Auftrag / Objekt(e)", "Anmerkungen", "Fertig"}) {
@SuppressWarnings("rawtypes")
Class[] columnTypes = new Class[]{Integer.class, String.class, String.class, String.class, String.class,
String.class, String.class, String.class, String.class, String.class, String.class, String.class, Boolean.class};
@SuppressWarnings({"unchecked", "rawtypes"})
public Class getColumnClass(int columnIndex) {
return columnTypes[columnIndex];
}
};
return model;
}
因为它可能有效,所以它根本不是真正的
CustomTableModel
,它只是从方法内创建的DefaultTableModel
,并返回+完全混淆(至少对我来说是:))。
虽然它有效,但我不确定它到底是如何工作的,据我了解,它会将一个空对象数组(2D)以及一个字符串数组传递给 DefaultTableModel 的构造函数,到目前为止这是可以理解的(空数据 + 列名称) )根据 DefaultTableModel 构造函数的要求。 但是我不明白在
..."Fertig"}) {
之后列类如何传递给构造函数,因为两个所需的参数(数据+列名称)已经被传递了。
我最好的猜测是这种方法:
public CustomTableModel() {
super(new Object[][]{{},{Integer.class, String.class, String.class, String.class, String.class,
String.class, String.class, String.class, String.class, String.class, String.class, String.class, Boolean.class}}, new String[]{"Lfd. Nr.", "FB Nr.", "Auftr. / Meld. Nr.", "Betra Nr.", "Datum", "Bahnhof", "Str. Km.",
"Sprz.", "Arb. Zeit", "Mitarbeiter", "Auftrag / Objekt(e)", "Anmerkungen", "Fertig"});
}
由此我认为我的课程通过是完全错误的。
如果有人能启发我如何做到这一点,我会非常高兴,我想理解这一点。
TableModel
,它有两种方法,getColumnName
和getColumnClass
,现在,你已经覆盖了getColumnClass
,这很好,但在DefaultTableModel
内部,它使用您提供给构造函数的列名称,并在调用 getColumnName
get 时返回它们。
该数组还定义了
getColumnCount
的返回值。
因此,当调用
JTable#setModel
时,它要做的一件事(默认情况下)是调用它的 createDefaultColumnsFromModel
方法,然后使用 TableModel
构建它的 TableColumnModel
,使用 TableModel#getColumnName
方法提供TableColumn
的 headerValue
属性。
魔法!
但我不明白列类是如何在 ..."Fertig"}) { 之后传递给构造函数的,因为两个所需的参数(数据+列名称)已经被传递了。
它们不会传递给构造函数,而是在匿名类中初始化。
您最后发布的代码看起来也有些奇怪,可能无法按预期工作。
我可能不会扩展
DefaultTableModel
,因为无论如何它可能需要覆盖很多方法,而是扩展AbstractTableModel
并实现缺少的方法以及需要覆盖的方法(不应该很多)。
然后我可能会传递一个数组(您可以在此处使用 vargs)或包含名称和类的
ColumnDefinition
(或其他名称)对象的集合,例如像这样的:
TableModel tm = new CustomTableModel( new ColumnDefinition("Lfd. Nr.", Integer.class),
new ColumnDefinition("FB Nr.", String.class), ...)
构造函数看起来像这样:
public CustomTableModel(ColumnDefinition... columns) { ... }