Добавление значка в JTable путем переопределения DefaultTableCellRenderer

Я пытаюсь добавить значок в определенный столбец JTable, указав свой собственный модуль визуализации ячеек таблицы, как показано ниже (на основе частей этого руководства):

public class MyTableCellRenderer extends DefaultTableCellRenderer {

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if(column == MyTableModel.IMAGE_COLUMN){
            String status = (String)value;
            Icon icon = StatusImageUtil.getStatusIcon(status);

            if(icon == null){
                label.setText(status);
            }else{
                label.setIcon(icon);
            }
        }
        return label;
    }
}

Приведенный выше код работает, но:

  1. Все ячейки имеют значок вместо определенного, который я хочу указать в выражении if
  2. Ячейка MyTableModel.IMAGE_COLUMN, которая должна иметь только значок, также имеет текст.

заранее спасибо


person n002213f    schedule 18.08.2009    source источник


Ответы (1)


Для повышения производительности JTable повторно использует одну и ту же метку для каждой отображаемой ячейки. Это означает, что вам нужно устанавливать как текст, так и значок каждый раз, когда вы его меняете.

То же самое касается шрифтов, фоновых цветов и тому подобного.

 if(icon == null){
                    label.setText(status);
                    label.setIcon(null);
            }else{  
                    label.setText("");
                    label.setIcon(icon);
            }

должен сделать трюк,

person Peter    schedule 18.08.2009
comment
спасибо, не знал, что одна и та же метка используется для всех ячеек таблицы. Используя приведенный выше код, я получил те же результаты. Я решил это, установив нулевой значок сразу после приведения средства визуализации ячеек таблицы к JLabel. - person n002213f; 18.08.2009
comment
да, мой совет не помог, потому что я забыл о столбце == MyTableModel.IMAGE_COLUMN test - person Peter; 18.08.2009