链接到对象的 JTable 图标
JTable icon linked to object
我有以下问题:我目前有几个 class 代表各种植物和动物,它们都有基础 class "Organism",它们是世界的一部分(另一个 class,其中包含有机体或空域的“2D”容器 - 有点像世界的 2D 地图)。同一时间只能有1个生物占据一个世界槽
我想画的是这个世界的地图。为此,我创建了一个 JTable,它使用世界的 2D 容器作为数据源。现在的问题是,我不知道如何让 JTable 使用 class 自己的方法来绘制单元格。
每个 class 都有它的方法,return 是代表它的图像:
@Override public ImageIcon drawing(){
return new ImageIcon("Guarana.png");
}
我的 table 有以下组件可用:
private String[] columnNames;
private Object[][] data;
我已经创建了自己的 table 模型(遵循此处的教程:https://docs.oracle.com/javase/tutorial/uiswing/components/table.html)
所以 table 的创建看起来像这样:
model = new MyTableModel(testowyString, organizmy);
JTable table = new JTable(model);
table.setFillsViewportHeight(true);
table.setDefaultRenderer(Organizm.class, new IconRenderer());
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(210, 0, 780, 900);
add(scrollPane);
如您所见,我已尝试创建自己的 IconRenderer(但出于某种原因,JTable 仍未绘制图标):
public class IconRenderer 扩展了 DefaultTableCellRenderer {
ImageIcon sheepIcon = new ImageIcon("Owca.png");
ImageIcon wolfIcon = new ImageIcon("Wilk.png");
ImageIcon mouseIcon = new ImageIcon("Mysz.png");
ImageIcon chickenIcon = new ImageIcon("Kurka.png");
ImageIcon turtleIcon = new ImageIcon("Zolw.png");
ImageIcon grassIcon = new ImageIcon("Trawa.png");
ImageIcon guaranaIcon = new ImageIcon("Guarana.png");
ImageIcon emptyIcon = new ImageIcon("Pusty.png");
public IconRenderer() { super(); }
public void setValue(Organizm organizm) {
setIcon((organizm == null) ? ikonkaPusty : organizm.rysowanie());
}
}
(是的,这里的图标是我旧代码的一部分,当时每个 class 都没有 return 它是图标)
总结一下:我想做到这一点,所以当 JTable 绘制地图时,它使用链接到单元格的 class 的现有方法绘制图标。
您需要覆盖 getTableCellRendererComponent()
并从那里调用 setIcon()
,而不是覆盖 setValue()
。 value
参数将是 Organizm
,即 table 单元格的值,因此您可以这样做:
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
Organizm o = (Organizm) value;
setIcon((organizm == null) ? ikonkaPusty : organizm.rysowanie());
return this;
}
我假设 organizm.rysowanie()
returns ImageIcon
。如果这是真的,那么您的 setValue()
实施可能应该有效。我的另一个想法是将您的 setValue()
签名更改为 public void setValue(Object value)
并在上面示例中的方法中强制转换 value
。这将避免方法重载问题,这些问题会导致使用 Object
参数调用 setValue()
方法而不是使用 Organizm
参数调用 setValue()
方法。
我有以下问题:我目前有几个 class 代表各种植物和动物,它们都有基础 class "Organism",它们是世界的一部分(另一个 class,其中包含有机体或空域的“2D”容器 - 有点像世界的 2D 地图)。同一时间只能有1个生物占据一个世界槽
我想画的是这个世界的地图。为此,我创建了一个 JTable,它使用世界的 2D 容器作为数据源。现在的问题是,我不知道如何让 JTable 使用 class 自己的方法来绘制单元格。
每个 class 都有它的方法,return 是代表它的图像:
@Override public ImageIcon drawing(){
return new ImageIcon("Guarana.png");
}
我的 table 有以下组件可用:
private String[] columnNames;
private Object[][] data;
我已经创建了自己的 table 模型(遵循此处的教程:https://docs.oracle.com/javase/tutorial/uiswing/components/table.html)
所以 table 的创建看起来像这样:
model = new MyTableModel(testowyString, organizmy);
JTable table = new JTable(model);
table.setFillsViewportHeight(true);
table.setDefaultRenderer(Organizm.class, new IconRenderer());
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(210, 0, 780, 900);
add(scrollPane);
如您所见,我已尝试创建自己的 IconRenderer(但出于某种原因,JTable 仍未绘制图标):
public class IconRenderer 扩展了 DefaultTableCellRenderer {
ImageIcon sheepIcon = new ImageIcon("Owca.png");
ImageIcon wolfIcon = new ImageIcon("Wilk.png");
ImageIcon mouseIcon = new ImageIcon("Mysz.png");
ImageIcon chickenIcon = new ImageIcon("Kurka.png");
ImageIcon turtleIcon = new ImageIcon("Zolw.png");
ImageIcon grassIcon = new ImageIcon("Trawa.png");
ImageIcon guaranaIcon = new ImageIcon("Guarana.png");
ImageIcon emptyIcon = new ImageIcon("Pusty.png");
public IconRenderer() { super(); }
public void setValue(Organizm organizm) {
setIcon((organizm == null) ? ikonkaPusty : organizm.rysowanie());
}
}
(是的,这里的图标是我旧代码的一部分,当时每个 class 都没有 return 它是图标)
总结一下:我想做到这一点,所以当 JTable 绘制地图时,它使用链接到单元格的 class 的现有方法绘制图标。
您需要覆盖 getTableCellRendererComponent()
并从那里调用 setIcon()
,而不是覆盖 setValue()
。 value
参数将是 Organizm
,即 table 单元格的值,因此您可以这样做:
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
Organizm o = (Organizm) value;
setIcon((organizm == null) ? ikonkaPusty : organizm.rysowanie());
return this;
}
我假设 organizm.rysowanie()
returns ImageIcon
。如果这是真的,那么您的 setValue()
实施可能应该有效。我的另一个想法是将您的 setValue()
签名更改为 public void setValue(Object value)
并在上面示例中的方法中强制转换 value
。这将避免方法重载问题,这些问题会导致使用 Object
参数调用 setValue()
方法而不是使用 Organizm
参数调用 setValue()
方法。