【问题标题】:Initialize "empty" DefaultTableModel with column names and column classes用列名和列类初始化“空”DefaultTableModel
【发布时间】:2016-06-05 09:34:01
【问题描述】:

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


    【解决方案1】:

    如果你看一下TableModel,它有两个方法,getColumnName 和getColumnClass,现在,你已经覆盖了getColumnClass,它是find,但在DefaultTableModel 内部,它使用您提供给构造函数的列名,并在调用 getColumnName get 时返回它们。

    这个数组也定义了getColumnCount的返回值。

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

    魔法!

    【讨论】:

      【解决方案2】:

      但我不明白在 ..."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) { ... }
      

      【讨论】:

      • public CustomTableModel(ColumnDefinition... columns) { ... } ↝ { ... } ↝ super(columns); ?
      • @Flatron 不明白。 AbstractTableModel 只有一个无参数的构造函数,所以这里没什么特别的。
      • 好吧对不起我的意思是构造函数内容应该是super(columns);
      • @Flatron 不,构造函数内容应该是实际实现自定义表模型所需的任何内容,即您可能会存储列定义并在getColumnName(int)、getColumnClass(int) 等中访问它们。
      • 我不确定这到底是什么意思,我不必将它们传递给超类构造函数吗?否则,如果我的 CustomTableModel 中有一些变量,我会将它们存储在那里,但实际模型仍然没有分配它们?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多