0

我在将图像插入 JTable 时遇到问题。我搜索并发现有两种方法。您可以覆盖 tablemodel 的 getcolumnclass 或创建自定义 tablecellrender。

我选择使用以下代码制作自己的单元格渲染器:

public class MyRenderer extends DefaultTableCellRenderer {

    /*
     * @see TableCellRenderer#getTableCellRendererComponent(JTable, Object, boolean, boolean, int, int)
     */
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                 boolean isSelected, boolean hasFocus, 
                                                 int row, int column) {
      ImageIcon icon = new ImageIcon("Images/green.png");
      setText((String)value);
      setIcon(icon);
      return this;
    }
}

在我填写表格字段的方法中,我用这一行添加图像..

laneTable.getColumnModel().getColumn(4).setCellRenderer(new MyRenderer());

问题是图像显示为空白区域。它肯定会渲染一些东西,因为当您选择行时,所有字段都突出显示蓝色,除了第 4 列(带有图像的列)仍然是白色的。我一生都无法弄清楚为什么图像没有显示。我已经以各种方式调整了行高,以查看图像是否存在,但不在视线范围内。似乎并非如此。

我也尝试执行覆盖方法,但我想我没有正确执行语法,因为 netbeans 给出了语法错误,而且我还没有找到一个关于如何做到这一点的体面示例。

谢谢。

编辑:我尝试了更简单的方法,使用下面的代码覆盖类,但单元格仍然是空白的。而且我已经测试了将图像插入标签并且这些工作,所以路径是正确的。

           @Override
        public Class getColumnClass(int column)
        {

            if (column == 4)
            {

                return ImageIcon.class;
            }
            return Object.class;
            // other code; default to Object.class
        }
4

1 回答 1

5

我选择用这段代码制作我自己的单元格渲染器..

为什么要重新发明轮子?如您所见,您遇到了问题,因此只需使用默认渲染器并覆盖 getColumnClass() 方法。

此外,您永远不会阅读 rednering 代码中的图像。

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableIcon extends JFrame
{
    public TableIcon()
    {
        ImageIcon aboutIcon = new ImageIcon("about16.gif");
        ImageIcon addIcon = new ImageIcon("add16.gif");
        ImageIcon copyIcon = new ImageIcon("copy16.gif");

        String[] columnNames = {"Picture", "Description"};
        Object[][] data =
        {
            {aboutIcon, "About"},
            {addIcon, "Add"},
            {copyIcon, "Copy"},
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable( model )
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            public Class getColumnClass(int column)
            {
                return getValueAt(0, column).getClass();
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        TableIcon frame = new TableIcon();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }

}

更新:

也许这更容易理解:

public Class getColumnClass(int column)
{
//  return getValueAt(0, column).getClass();
    return (column == 0) ? Icon.class : Object.class;
}
于 2011-06-24T19:20:09.437 回答