如何将图像渲染到JTable单元格

时间:2014-05-09 08:36:30

标签: java swing jtable cell renderer

我想在我的JTable的单元格上应用渲染器,为此我创建了一个名为myRenderer的类:

import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyRenderer extends DefaultTableCellRenderer {

public Component getTableCellRendererComponent(JTable table, ImageIcon icon) {

setIcon(icon);
return this;
}
}

我使用这段代码在单元格上应用渲染器:

MyRenderer renderer = new MyRenderer();

renderer.getTableCellRendererComponent(table, icon);

table.getColumnModel().getColumn(6).setCellRenderer(renderer);

问题是,rebderer应用于第6列中的所有单元格,我希望它仅应用于一个单元格(行/列),但我不知道该怎么做?

提前致谢

2 个答案:

答案 0 :(得分:5)

除了您甚至没有正确覆盖getTableCellRendererComponent方法之外,您甚至不需要自定义渲染器来在列中显示图像

来自How to Use Tables。这是一个包含默认预配置渲染器的类型列表

  • Boolean - 使用复选框呈现。
  • Number - 由右对齐标签呈现。
  • Double, Float - 与Number相同,但是对象到文本的转换由NumberFormat实例执行(使用当前语言环境的默认数字格式)。
  • Date - 由标签呈现,由DateFormat实例执行对象到文本的翻译(使用日期和时间的简短样式)。
  • ImageIcon,图标 - 由居中的标签呈现。
  • Object - 由显示对象的字符串值的标签呈现。

因此,您可以在表格中添加ImageIcon,如果您正确覆盖getColumnClass()

,它将会这样呈现

同样来自教程:

  

要选择显示列中单元格的渲染器,表格首先确定是否为该特定列指定了渲染器。如果没有,则表调用表模型的getColumnClass方法,该方法获取列的单元格的数据类型。接下来,该表将列的数据类型与已注册单元格渲染器的数据类型列表进行比较

所以说你有一个DefaultTableModel有三列,你想在最后一列中找到ImageIcon。你会做这样的事情

DefaultTableModel model = new DefaultTableModel(...) {
    @Override
    public Class<?> getColumnClass(int column) {
        switch (column) {
            case 2: return ImageIcon.class;
            default: return String.class
        }
    }
};
JTable table = new JTable(model);

然后只需将ImageIcon添加到第三列,就会将其呈现为

String colOneDate = "Data";
String colTwoData = "Data";
ImageIcon colThreeIcon = new ImageIcon(...);
model.addRow(new Object[] { colOneData, colTwoData, colThreeIcon });

您可能还需要相应地将列宽和高度设置为图像的大小。为此,您可以看到these questions

中的任何一个

答案 1 :(得分:1)

您可以使用getTableCellRendererComponent函数,如下所述。要显示图标的图标,行和列,您可以使用setter方法从外面设置

import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


  public class MyRenderer extends DefaultTableCellRenderer {

public MyRenderer() {
    // TODO Auto-generated constructor stub
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
            row, column);

    int neededRow=0; // set the needed row here in which the icon to be dispayed
    int neededcolumn=0; // set the needed column here in which the icon to be dispayed

    if(row==neededRow && column==neededcolumn)
    {
        setIcon(icon);
    }

    return this
}
}