我有一个元素列表,这些元素又是元素列表:
{{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()
。这里显示了一个完整的示例。例如,根据需要使用合适的渲染器优化每个单元的外观。