初始化"空"具有列名和列类

时间:2016-02-23 13:51:13

标签: java swing jtable awt defaulttablemodel

我创建了自己的名为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"});
    }

不幸的是,这样结束了这样的混乱: Wrong outcome, Classes are not passed over right

由此我假设我的类传递是完全错误的。

我期望得到的是(添加行之后): Result with "old" implementation from Eclipse AWT

如果有人可以告诉我如何做到这一点,我会非常高兴,我想了解这一点。

2 个答案:

答案 0 :(得分:1)

如果您查看TableModel,它有两种方法,getColumnNamegetColumnClass,现在,您已覆盖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) { ... }
相关问题