Как использовать CellRenderer по строкам

#java #swing #jtable #renderer

Вопрос:

Я новичок в использовании TableCellRenderers. Я использовал документацию по Orcale и несколько видеороликов, чтобы получить тот, который работает. Для вызова средства визуализации я использую код:

 table.getColumnModel().getColumn(x).setCellRenderer(new Renderer());
 

Для моей таблицы я хочу использовать это для каждой строки. Я повозился с заменой столбцов строками, но моя среда разработки показывает, что это не методы с таким именем, что меня очень удивляет.

Есть ли какой-то код, который может получить значение(x)?

код средства визуализации, если это необходимо (аргумент был взят из кода выше для упрощения)

         int t;
        public Renderer(int x){
            this.t=x;
        }
        
        @Override
        public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){

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

            DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
            
            if(t==1){
                x.setBackground(Color.GREEN);
            }else{
                x.setBackground(Color.WHITE);
            }
            
            return x;
        }
    }
 

Комментарии:

1. Почему бы не положиться на row значение в getTableCellRendererComponent методе?

2. См.: Визуализация строк таблицы для примеров.

Ответ №1:

Вы можете переопределить метод prepareRenderer для JTable

         @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row,
        int column) {
            int row = convertRowIndexToModel(row);
            int column = convertColumnIndexToModel(column);
            if (!isRowSelected(row)) {
                if (column != 0 || row != 0) {
                    comp.setBackground(Color.RED);
                } 
            }
            return comp;
       }
    };
 

Комментарии:

1. (1 ) для выполнения визуализации только в том случае, если строка не выбрана.

Ответ №2:

Мне не нравится возиться с JTable самим собой, так что, может быть

         table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                    boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                c.setBackground(t == 1 ? Color.green : Color.white);
                return c;
            };
        });