Изменение цвета ячейки JTable ForeGround - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь изменить цвет ячейки JTable (передний план). Он работает, но он окрашивает ячейку + 1, а не требуемую ячейку (как вы видите в моем коде).

Я пытаюсь изменить цвет текущей строки и столбца 3, но фактически он меняет цвет следующего столбца.

Этот код добавлен в пользовательский код.

BaritemsTable = new javax.swing.JTable(){
@Override
public Component prepareRenderer (TableCellRenderer renderer, int rowIndex , int columnIndex ){
    Component component = super.prepareRenderer(renderer , rowIndex , columnIndex );
    Object value = getModel().getValueAt(rowIndex , columnIndex);

    if (columnIndex == 3){

        if (value.equals("Ready")){
            BaritemsTable.setForeground(new java.awt.Color(51, 204, 0));
            BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
        }
        if (value.equals("Process")){
            BaritemsTable.setForeground(new java.awt.Color(51, 51, 255));
            BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
        }
        if (value.equals("Queued")){
            BaritemsTable.setForeground(new java.awt.Color(255, 0, 0));
            BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
        }

    } else {
        BaritemsTable.setForeground(new java.awt.Color(0, 0, 0));
        BaritemsTable.setFont(new Font("Tahoma", Font.PLAIN, 48));
    }
    return component;
  }
};

1 Ответ

0 голосов
/ 17 февраля 2020

Проблема в вашем коде, определенно такая:

Object value = getModel().getValueAt(rowIndex , columnIndex);

Индексы, которые вы получаете в обработчиках и слушателях, методы et c в JTable являются индексами представлений и могут использоваться только для индексации Посмотреть. Другими словами, вы должны написать:

Object value = getValueAt(rowIndex , columnIndex); // Use JTable.getValueAt

Вторая проблема: при ссылке на индекс столбца непосредственно в prepareRenderer вы должны использовать индекс представления в этом месте. Скорее всего, вам нужно

if (convertColumnIndexToModel(columnIndex) == 3)

JTable.convertColumnIndexToModel, чтобы убедиться, что вы используете индекс из модели. Зачем все это нужно, и что такое индекс вида и модельный индекс? Как они связаны? Я дал немного больше объяснений здесь .


Третья проблема: если вы хотите установить цвета и шрифты для строки / ячейки, вам нужно установить их в компоненте, возвращаемом из super.prepareRenderer, а не на столе. Например:

if (value.equals("Ready")){
    component.setForeground(new java.awt.Color(51, 204, 0));
    component.setFont(new Font("Tahoma", Font.PLAIN, 48));
}
...