用 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。
我有一个元素列表,这些元素又是元素列表:
{{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。