链接到对象的 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() 方法。