用 1d 到 2d 列表填充 JTable,并限制为 属性 个 Object

Fill JTable with 1d-to-2d list, and restrict to property of Object

我有一个元素列表,这些元素又是元素列表:

{{entity1, entity2}, {}, {entity3}, {entity4}, {entity5, entity6, entity7}, {}, ...}

我想将此列表转换为 JTable。该列表长 36,应该转换为 6 乘 6 的 table。假设上面的示例是 3x2 的 table,结果为:

_______________________________
| entity1 |         | entity3 |
| entity2 |         |         |
|_________|_________|_________|
| entity4 | entity5 |         |
|         | entity6 |         |
|         | entity7 |         |
|_________|_________|_________|

旁注,每个实体本身就是一个对象(例如员工对象),我只想输出特定的 属性 个实体(例如 .firstName 或类似的东西)。也许这可以用 .map 来完成?但不幸的是,我对此不是很熟悉。

到目前为止,我得到的是初始列表的循环。假设外部列表称为位置(即 36 个位置),内部元素是特定位置的员工。 (在实践中,实体在数组列表中,位置在数组中。)这是未经测试的,但它似乎足够简单,应该可以工作? (如果不是请告诉我。)

Location[] locations; // 36 locations
Location[][] locations2d; // new array 6x6
for(int x = 0; x < 6; x++) {
  for(int y = 0; y < 6; y++) {
    locations2d[x][y] = locations[6*x+y];
  }
}

但是考虑到我只想要该列表中实体的 .firstName,我现在如何轻松地将这个 2dlocations 放入我的 6x6 JTable 中?


尝试一些东西,我想到了这个:

public Overview() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        tabbedPane.setBounds(10, 11, 414, 239);
        contentPane.add(tabbedPane);

        // Create new scrollpane
        JScrollPane scrollPaneEntityOverview = new JScrollPane();
        scrollPaneEntityOverview.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        // Set entity location data to table
        Object[][] data = locationToTable();
        JTable table = new JTable(data, null); // 1

        // Create new scrollpane, initialize with table
        JScrollPane scrollPaneMap = new JScrollPane(table);
        scrollPaneMap.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        tabbedPane.addTab("Entity overview", null, scrollPaneEntityOverview, null);
        tabbedPane.addTab("Map", null, scrollPaneMap, null);
    }

    public Object[][] locationToTable() {
        Object[][] data = new Object[6][6];
        Location[] locations = WorldMap.getInstance().getLocations();
        for (int x = 0; x < 6; x++) {
            for(int y = 0; y < 6; y++) {
                data[x][y] = locations[6*x+y];
            }
        }
        return data;
    }

如您所见,我正在尝试将 table 添加到滚动窗格,它是选项卡式 window 的一部分。然而,当尝试这个时,选项卡是空的:没有显示。此外,我还得到以下 NullPointerException,它链接到上面代码片段中的 //1

java.lang.NullPointerException
    at javax.swing.JTable.getColumnCount(Unknown Source)
    at javax.swing.JTable.createDefaultColumnsFromModel(Unknown Source)
    at javax.swing.JTable.tableChanged(Unknown Source)
    at javax.swing.JTable.setModel(Unknown Source)
    at javax.swing.JTable.<init>(Unknown Source)
    at javax.swing.JTable.<init>(Unknown Source)
    at javax.swing.JTable.<init>(Unknown Source)
    at game.Overview.<init>(Overview.java:59)
    at game.Overview.run(Overview.java:29)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access0(Unknown Source)
    at java.awt.EventQueue.run(Unknown Source)
    at java.awt.EventQueue.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Creating a Table Model 所示,这是扩展 AbstractTableModel 的好案例。对于一些任意 Entity,

class Entity extends Object {…}

为您的数据建模列表列表:

class EntityModel extends AbstractTableModel {

    public EntityModel(List<List<Entity>> data) {
        this.data = data;
    }

    List<List<Entity>> data;

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public int getColumnCount() {
        return data.get(0).size();
    }

    @Override
    public Object getValueAt(int row, int col) {
        List list = data.get(row);
        return list.get(col);
    }

根据需要覆盖 getColumnName()。显示了一个完整的示例 here. Refine the appearance of each cell using a suitable renderer as required, for example