GUI中不显示DefaultTableModel

时间:2015-03-09 18:52:19

标签: java swing oop jtable

我创建的DefaultTableModel模型未在我的GUI中显示。它只显示为黑线。需要了解原因?

感谢您的帮助。

DefaultTableModel的代码是:

public class MyTableModel {

public static DefaultTableModel model = new DefaultTableModel();

public MyTableModel() {

    model.addColumn("Col1");
    model.addColumn("Col2");
    model.addColumn("Col2");
    model.addColumn("Col2");
    model.addColumn("Col2");
    model.addColumn("Col2");

    model.addRow(new Object[] { "Hammer", "5", "1000", "Werkzeug",
            new Boolean(false), "Ein schöner Hammer" });
    model.addRow(new Object[] { "Computer", "2", "100000", "Elektronik",
            new Boolean(true), "Ein schöner Computer" });
    model.addRow(new Object[] { "Smartphone", "12", "10000", "Elektronik",
            new Boolean(false), "Ein schönes Smartphone" });
    model.addRow(new Object[] { "Hose", "6", "4000", "Kleidung",
            new Boolean(true), "Eine schöne Höse" });
    model.addRow(new Object[] { "Geschichtsbuch", "7", "1000", "Bücher",
            new Boolean(false), "Ein schönes Buch" });

}

}

这是GUI的一部分,我实现了模型(如果我使用AbstractTableModel,它可以工作):

            JTable table = new JTable(MyTableModel.model);
        JScrollPane scrollTable = new JScrollPane(table,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        GridBagConstraints gbc_Table = new GridBagConstraints();
        gbc_Table.insets = new Insets(0, 10, 5, 5);
        gbc_Table.gridx = 0;
        gbc_Table.gridy = 1;
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        Dimension d = table.getPreferredSize();
        d.width = 500;
        table.setPreferredScrollableViewportSize(d);
        contentPanel.add(scrollTable, gbc_Table);

2 个答案:

答案 0 :(得分:0)

MyTableModel.model为空。它只在你调用MyTableModel的构造函数时才会填充,而你永远不会这样做。使用静态非最终字段是不好的做法。让它们公开更糟糕。从构造函数初始化静态字段更糟糕。

将班级更改为

public class MyTableModelFactory {

    public static DefaultTableModel create() {
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("Col1");
        model.addColumn("Col2");
        model.addColumn("Col2");
        model.addColumn("Col2");
        model.addColumn("Col2");
        model.addColumn("Col2");

        model.addRow(new Object[] { "Hammer", "5", "1000", "Werkzeug",
                new Boolean(false), "Ein schöner Hammer" });
        model.addRow(new Object[] { "Computer", "2", "100000", "Elektronik",
                new Boolean(true), "Ein schöner Computer" });
        model.addRow(new Object[] { "Smartphone", "12", "10000", "Elektronik",
                new Boolean(false), "Ein schönes Smartphone" });
        model.addRow(new Object[] { "Hose", "6", "4000", "Kleidung",
                new Boolean(true), "Eine schöne Höse" });
        model.addRow(new Object[] { "Geschichtsbuch", "7", "1000", "Bücher",
                new Boolean(false), "Ein schönes Buch" });

    }
}

并将其用作

JTable table = new JTable(MyTableModelFactory.create());

答案 1 :(得分:0)

嗯,问题是MyTableModel的构造函数永远不会被执行,所以它不会填充DefaultTableModel。

我建议你在MyTableModel中添加一个方法来添加你需要的数据。

public static void initialize(){
        model.addColumn("Col1");
        ...
        new Boolean(false), "Ein schönes Buch" });
}

因此,您可以在创建JTable之前初始化模型

TableModelControl.initialize();
JTable table = new JTable(TableModelControl.model);

此外,我不是Lists,Tables等公共静态模型的忠实粉丝。我建议将来不要这样做。