簡體   English   中英

用列名和列類初始化“空” DefaultTableModel

[英]Initialize “empty” DefaultTableModel with column names and column classes

我創建了自己的名為CustomTableModel的類,該類從DefaultTableModel擴展而來。

public class CustomTableModel extends DefaultTableModel {/*[...]*/}

我的計划是,當您使用new CustomTableModel();調用構造函數時new CustomTableModel(); 您將獲得一個新的CustomTableModel已使用列名和列類進行了預初始化。

我正在運行類似的東西,但是當前的實現是從Eclipse AWT(窗口生成器)中產生的,您還可以在其中使用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"});
    }

不幸的是,這以這樣的混亂結束: 錯誤的結果,類未通過正確的傳遞

據此,我認為我的課程通過是完全錯誤的。

我期望得到的是這個(添加行之后): Eclipse AWT中“舊”實現的結果

如果有人可以啟發我這樣做,我將非常高興,我想了解這一點。

如果您看一下TableModel ,它有兩個方法getColumnNamegetColumnClass ,現在您已經覆蓋了getColumnClass ,這是找到的,但是在DefaultTableModel內部,它使用提供給構造函數的列名,並在getColumnName得到叫。

此數組還定義了getColumnCount的返回值。

因此,當調用JTable#setModel時,它將做的一件事(默認情況下)是調用它的createDefaultColumnsFromModel方法,然后使用TableModel來構建它的TableColumnModel ,並使用TableModel#getColumnName方法提供TableColumnheaderValue屬性。

魔法!

但是我不明白如何在...“ 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) { ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM