Определение целых чисел в классе столбцов разрывает / пропускает средство визуализации ячеек таблицы?

После того, как мне удалось отсортировать мои столбцы, определив классы столбцов, мой рендеринг ячеек теперь применяется только к столбцам, которые содержат значения String и не применяются к столбцам Integer?

Вот как это выглядит: ("% от достигнутой цели" - это целочисленный столбец, видимый белым - не должен быть белым)

Здесь показаны определения классов столбцов для классов String и Integer:

    JTable  compTable5 = new JTable();
    compTable5.setEnabled(false);
    DefaultTableModel model5 = new DefaultTableModel(){
        @Override
        public Class getColumnClass(int column) {
            switch (column) {
                case 0:
                    return String.class;
                case 1:
                    return Integer.class;

                default:
                    return String.class;

            }
        }
    };

Это рендерер

compTable5.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
        @Override
        public Component getTableCellRendererComponent(JTable table,
                                                       Object value, boolean isSelected, boolean hasFocus, int row, int col) {

            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);

            int status = (int)table.getValueAt(row, 1);
            String status2 = (String)table.getValueAt(row, 5);

            if ("Not Used".equals(status2)) {setBackground(Color.lightGray);setForeground(Color.black);}
            else if (status2.equals("Priority 1")) {setBackground(scaleRed);}
            else if ( status == 0 && !status2.equals("Working") && !status2.equals("Not Used") && !status2.equals("Priority 1")) {setBackground(pink);setForeground(Color.black);}
            else if (status < 20) {setBackground(scaleRed);}
            else if (status >= 20 && status < 40) {setBackground(scaleOrange);setForeground(Color.black);}
            else if (status >= 40 && status < 60) {setBackground(scaleYellow);setForeground(Color.black);}
            else if (status >= 60 && status < 80) {setBackground(scaleGreen1);setForeground(Color.black);}
            else if (status >= 80 && status < 100) {setBackground(scaleGreen2);setForeground(Color.black);}
            else if (status > 100) {setBackground(scaleBlue);setForeground(Color.white);}
            else {
                setBackground(table.getBackground());
                setForeground(table.getForeground());
            }

            return this;
        }
    });

Я java noob, и это мой первый пост stackru, спасибо за всю помощь, которую вы все уже оказали мне на этом форуме!

1 ответ

Решение

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

Вы связываете свой DefaultTableCellRenderer за Object.class, что является запасным вариантом, если не найдено более специализированного TableCellRenderer.

Попробуйте привязать ваш DefaultTableCellRenderer к Object.class и к Integer.class, как это:

DefaultTableCellRenderer myRenderer = new DefaultTableCellRenderer() {
  // all your code for the cell renderer, as in your example
}
compTable5.setDefaultRenderer(Object.class, myRenderer);
compTable5.setDefaultRenderer(Integer.class, myRenderer);
Другие вопросы по тегам