将图像插入JTable

时间:2011-06-24 19:13:34

标签: java swing jtable imageicon

我在将图像插入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
        }

1 个答案:

答案 0 :(得分:5)

  

我选择使用此代码创建自己的单元格渲染器。

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

此外,您永远不会读取更新代码中的图像。

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;
}