【问题标题】:Inserting an Image into a JTable将图像插入 JTable
【发布时间】:2011-06-24 19:13:33
【问题描述】:

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

【问题讨论】:

    标签: java swing jtable imageicon


    【解决方案1】:

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

    为什么要重新发明轮子?如您所见,您遇到了问题,因此只需使用默认渲染器并覆盖 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;
    }
    

    【讨论】:

    • 哎呀,你比我快。
    • @Jesse:覆盖只是说使用给定列中第一个单元格对象的类作为整个列的类。由于该单元格的模型值将是 ImageIcon,因此它将返回 ImageIcon.class
    • 好吧,我只是尝试了覆盖方法,它只是显示我的图像的路径名,就像它没有调用正确的覆盖一样。我显然没有做对。我正在使用 netbean 的 GUI 创建器,因为它们太酷了,所以所有代码都被锁定了。所以我不能像示例中那样做
    • 我显然只是在这里没有得到任何东西。我需要做什么来覆盖getcolumnclass,然后将图像插入行/列。是否有所有步骤的示例?这个例子让你在代码中创建表时覆盖了类。我不能这样做,因为netbeans将它锁定了,所以当我用值填充我的表时要使用什么语法?
    • 当然,您可以扩展和覆盖 Netbeans 中的类和方法。如果你不能,它就不是一个有效的工具。这就是为什么您应该花时间学习 Java 而不是 IDE。我不知道生成的代码是什么样子我无法建议您需要更改什么或需要更改它的位置。
    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 2015-02-16
    • 2011-05-20
    • 2011-03-14
    • 1970-01-01
    • 2018-03-26
    • 2017-08-23
    相关资源
    最近更新 更多