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



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

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

我想将此列表转换为JTable。这个列表有36个长,应该翻译成6乘6的表格。假设上面的例子是一个3x2的表,结果是:

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

附带说明,每个实体本身就是一个对象(例如employee对象),我只想输出实体的特定属性(例如.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;
    }

正如您所看到的,我正在尝试将该表添加到滚动窗格中,滚动窗格是选项卡窗口的一部分。然而,当尝试此操作时,选项卡是空的:没有显示任何内容。此外,我还得到了以下NullPointerException,它链接到上面片段中的//1

java.lang.NullPointerException
    at javax.swing.JTable$1.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$1.run(Overview.java:29)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.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)

创建表模型所示,这是扩展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()。这里显示了一个完整的示例。例如,根据需要使用合适的渲染器优化每个单元的外观。

最新更新