1

我是java-swing的新手。我正在尝试在表格单元格中添加图标。但是当我在单元格中添加 ImageIcon 时,它只显示路径而不是图标。

这是我的代码。

 public void createGUI(ArrayList<String> params, String type) {

    try {
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("ParameterName");
        model.addColumn("ParameterType");
        model.addColumn("Operation");
        for (int i = 0; i < params.size() - 4; i++) {
            String param_name = params.get(i).toString().substring(0, params.get(i).toString().indexOf("["));
            String param_type = params.get(i).toString().substring(params.get(i).toString().indexOf("[") + 1, params.get(i).toString().indexOf("]"));
            //URL url = ClassLoader.getSystemClassLoader().getResource("");
            ImageIcon image = new ImageIcon("/com/soastreamer/resources/delete_idle.png");
          //  JLabel label = new JLabel(image);
            model.addRow(new Object[]{param_name, param_type.toUpperCase(),image});

        }


        Action delete = new AbstractAction() {

            public void actionPerformed(ActionEvent e) {
                JTable table = (JTable) e.getSource();
                int modelRow = Integer.valueOf(e.getActionCommand());
                ((DefaultTableModel) table.getModel()).removeRow(modelRow);
            }
        };

这是清晰理解的图像。

在此处输入图像描述

请给我提示或任何参考。谢谢你。

4

2 回答 2

5

问题出在您的 TableModel 上,您必须告诉表格它必须在该列中呈现图像,从而覆盖 getColumnClass(int column)模型的方法。

看看camickr的这个答案

更新

使用 DefaultTableModel 的渲染器绘制带有 ImageIcon 的 JTable 的最小示例。我再次通过 camickr 从这个答案中借用了updateRowHeights()代码,没有它,图标比行大并且没有完全显示。

这里重要的是,现在当渲染器调用 时getColumnClass(1),它会ImageIcon.class执行渲染图标的代码。默认情况下,此方法将返回Object.class,渲染器将忽略它是图标的事实。

import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class ImageIconTable
{
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ImageIconTable().initGUI();
            }
        });
    }

    public void initGUI()
    {
        JFrame frame = new JFrame();        
        DefaultTableModel tableModel = new DefaultTableModel()
        {
            @Override
            public Class getColumnClass(int column)
            {
                if (column == 1) return ImageIcon.class; 
                return Object.class;
            }
        };
        tableModel.addColumn("Row 1");
        tableModel.addColumn("Icons Row");
        tableModel.addRow(new Object[]{"This cell is an Object", new ImageIcon("icon.jpg")});
        _table = new JTable(tableModel);

        updateRowHeights();

        frame.add(new JScrollPane(_table), BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    private void updateRowHeights()
    {
        try
        {
            for (int row = 0; row < _table.getRowCount(); row++)
            {
                int rowHeight = _table.getRowHeight();

                for (int column = 0; column < _table.getColumnCount(); column++)
                {
                    Component comp = _table.prepareRenderer(_table.getCellRenderer(row, column), row, column);
                    rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
                }
                _table.setRowHeight(row, rowHeight);
            }
        }
        catch(ClassCastException e) {}
    }

    private JTable _table;
}

它看起来像这样:

显示图标的表格

于 2013-09-28T12:00:29.233 回答
0

首先,我建议您使用ImageIo.read()并使用返回的 BufferedImage 作为ImageIcon对象的参数。其次,使用Class.getResource()工具

YourClass.class.getResource("/com/soastreamer/resources/delete_idle.png");

然后,一切都应该工作。

于 2013-09-28T11:58:00.003 回答