Вставка изображения в JTable - PullRequest
0 голосов
/ 24 июня 2011

У меня проблема со вставкой изображений в JTable. Я искал и нашел, что есть 2 способа. Вы можете либо переопределить 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 давал синтаксические ошибки, и я пока не нашел достойного примера того, как это сделать.

Спасибо.

edit: я пробовал более простой способ, переопределив класс, используя приведенный ниже код, но ячейки все еще пустые. И я протестировал вставку изображений в метки, и они работают, поэтому путь правильный.

           @Override
        public Class getColumnClass(int column)
        {

            if (column == 4)
            {

                return ImageIcon.class;
            }
            return Object.class;
            // other code; default to Object.class
        }

1 Ответ

5 голосов
/ 24 июня 2011

Я решил создать свой собственный рендерер ячеек с этим кодом.

Зачем изобретать велосипед? Как вы видите, у вас проблемы, поэтому просто используйте рендерер по умолчанию и переопределите метод getColumnClass ().

Кроме того, вы НИКОГДА не читали изображение в коде повторения.

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;
}
...