使用列名和列类初始化“空”DefaultTableModel

问题描述 投票:0回答:2

我创建了自己的类,名为

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"});
    }

不幸的是,这会以这样的混乱结束:

由此我认为我的课程通过是完全错误的。

我期望得到的是这样的(添加行后):

如果有人能启发我如何做到这一点,我会非常高兴,我想理解这一点。

java swing jtable awt defaulttablemodel
2个回答
2
投票

如果你看一下

TableModel
,它有两种方法,
getColumnName
getColumnClass
,现在,你已经覆盖了
getColumnClass
,这很好,但在
DefaultTableModel
内部,它使用您提供给构造函数的列名称,并在调用
getColumnName
get 时返回它们。

该数组还定义了

getColumnCount
的返回值。

因此,当调用

JTable#setModel
时,它要做的一件事(默认情况下)是调用它的
createDefaultColumnsFromModel
方法,然后使用
TableModel
构建它的
TableColumnModel
,使用
TableModel#getColumnName
方法提供
TableColumn
headerValue
属性。

魔法!


1
投票

但我不明白列类是如何在 ..."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) { ... }
© www.soinside.com 2019 - 2024. All rights reserved.