我创建了自己的名为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)以及一个String数组传递给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"});
}
由此我假设我的类传递是完全错误的。
如果有人可以告诉我如何做到这一点,我会非常高兴,我想了解这一点。
答案 0 :(得分:1)
如果您查看TableModel
,它有两种方法,getColumnName
和getColumnClass
,现在,您已覆盖getColumnClass
,这是找到的,但在内部到DefaultTableModel
,它使用你提供给构造函数的列名,并在调用getColumnName
时返回它们。
此数组还定义getColumnCount
的返回值。
因此,当调用JTable#setModel
时,它将执行的一项操作(默认情况下)称为createDefaultColumnsFromModel
方法,然后使用TableModel
构建它TableColumnModel
},使用TableModel#getColumnName
方法提供TableColumn
的{{1}}属性。
魔术!
答案 1 :(得分:0)
但是我不明白列类在如何传递给构造函数之后......“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) { ... }