Зачем показывать путь вместо значка в ячейке таблицы

Я новичок в java-свинге. Я пытаюсь добавить значок в ячейку таблицы. но когда я добавляю 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);
            }
        };

Вот изображение для ясного понимания.

введите здесь описание изображения

Пожалуйста, дайте мне подсказку или любую ссылку. Спасибо.


person Sandip Armal Patil    schedule 28.09.2013    source источник


Ответы (2)


Проблема заключается в вашей TableModel, вы должны сообщить таблице, что она должна отображать изображение в этом столбце, переопределяя метод getColumnClass(int column) модели.

Посмотрите на этот ответ от camickr.

ОБНОВЛЕНИЕ

Минимальный пример JTable с ImageIcon, использующим средство визуализации 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;
}

Это выглядит так:

Таблица со значком

person DSquare    schedule 28.09.2013
comment
Можете ли вы обновить мой код .. я новичок в Java Swing, поэтому я не понимаю, как это сделать? - person Sandip Armal Patil; 28.09.2013
comment
@SandipArmalPatil Нет, я не могу обновить ваш код, но посмотрите мое обновление с примером выше. Вы должны интегрировать это в свой код. - person DSquare; 30.09.2013

Во-первых, я предлагаю вам использовать ImageIo.read() и используйте BufferedImage, возвращаемый в качестве аргумента для вашего объекта ImageIcon. Во-вторых, используйте Class.getResource()

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

Тогда все должно работать.

person Polentino    schedule 28.09.2013
comment
Нет, его код ImageIcon в порядке, проблема в том, что он отображает ImageIcon как объект. - person DSquare; 28.09.2013