【问题标题】:JTable icon linked to object链接到对象的 JTable 图标
【发布时间】:2016-01-08 13:49:33
【问题描述】:

我有以下问题:我目前有几个代表各种植物和动物的类,它们都有基类“有机体”,它们是世界的一部分(另一个类,包含有机体的“2D”容器或空字段 - 有点像世界的 2D 地图)。只有 1 个有机体可以同时占据一个世界槽。

我想要的是绘制这个世界的地图。为了做到这一点,我创建了一个 JTable,它使用世界的 2D 容器作为数据源。现在的问题是,我不知道如何让 JTable 使用类自己的方法来绘制单元格。

每个类都有它的方法,它返回一个代表它的图像:

@Override public ImageIcon drawing(){
    return new ImageIcon("Guarana.png");
}

我的表有以下可用组件:

private String[] columnNames;
private Object[][] data;

我已经创建了自己的表格模型(按照此处的教程:https://docs.oracle.com/javase/tutorial/uiswing/components/table.html

所以表的创建是这样的:

    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 仍然不绘制图标):

公共类 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());
}

}

(是的,这里的图标是我旧代码的一部分,当每个类都没有返回它的图标时)

总结一下:我想让它在 JTable 绘制地图时使用链接到单元格的类的现有方法绘制图标。

【问题讨论】:

    标签: java swing icons tablecellrenderer


    【解决方案1】:

    您需要覆盖getTableCellRendererComponent() 并从那里调用setIcon(),而不是覆盖setValue()value 参数将是 Organizm,即表格单元格的值,因此您可以这样做:

    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() 返回ImageIcon。虽然如果这是真的,那么您的 setValue() 实现可能应该有效。我的另一个想法是将您的setValue() 签名更改为public void setValue(Object value) 并在上面的示例中使用value 的方法。这将避免方法重载问题,这些问题会导致调用带有 Object 参数的 setValue() 方法,而不是带有 Organizm 参数的 setValue() 方法。

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 2019-02-22
      • 2020-10-06
      • 2011-06-08
      相关资源
      最近更新 更多