为什么在表格单元格中显示路径而不是图标

时间:2013-09-28 06:42:24

标签: java swing icons tablecell

我是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);
            }
        };

这是清晰理解的图像。

enter image description here

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

2 个答案:

答案 0 :(得分:5)

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

通过camickr查看此answer

<强>更新

带有ImageIcon的JTable的最小示例,使用DefaultTableModel的渲染器绘制它。我通过camickr再次从this answer借用了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;
}

看起来像这样:

Table displaying an icon

答案 1 :(得分:0)

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

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

然后,一切都应该有效。