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

San*_*til 1 java icons swing 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);
            }
        };
Run Code Online (Sandbox Code Playgroud)

这是清晰理解的图像.

在此输入图像描述

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

DSq*_*are 5

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

通过camickr 看看这个答案.

UPDATE

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

这里重要的是,现在当渲染器调用时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;
}
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

表显示图标

  • @SandipArmalPatil不,我无法更新您的代码,但请参阅上面的示例查看我的更新.您必须将其集成到您的代码中. (2认同)