Почему мой Java-обработчик ячеек не отображает выделение при выборе строки/ячейки?

У меня есть собственный визуализатор ячеек для ячейки, чтобы сделать перенос слов, чтобы можно было прочитать больше контента. Вот код:

import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;

import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;

public class TextWrapCellRenderer extends JTextArea implements TableCellRenderer {
    private static final long serialVersionUID = 1L;

    public TextWrapCellRenderer() {
        setLineWrap(true);
        setWrapStyleWord(true);
        setMargin(new Insets(0, 5, 0, 5));
        setSelectionColor(Color.GREEN);
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setText((String)value);
        setSize(table.getColumnModel().getColumn(column).getWidth(),getPreferredSize().height);
        setSelectionColor(Color.GREEN);

        return this;
    }
}

Обновить. Средство визуализации ячеек используется правильно, но когда пользователь выбирает строку в JTable, он отображает только выделение для нестандартных визуализированных ячеек. Однако подсветка показывает все остальные ячейки для этой строки. Это оставляет только одну ячейку с белым фоном, а остальная часть строки имеет синий цвет (в моем случае) в качестве выделенного цвета фона.

Ответ 1

Вам нужно проверить аргумент isSelected, чтобы узнать, выбрана ли ячейка или нет, например:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{
        setText((String)value);
        setSize(table.getColumnModel().getColumn(column).getWidth(),getPreferredSize().height);
        setSelectionColor(Color.GREEN);

        if (isSelected)
        {
            setBackground(table.getSelectionBackground());
            setForeground(table.getSelectionForeground());
        }
        else
        {
            setBackground(table.getBackground());
            setForeground(table.getForeground());
        }
        return this;
    }

Ответ 2

Я думаю, вы должны сначала вызвать реализацию по умолчанию:

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

Реализация по умолчанию будет обрабатывать все обычные аргументы, такие как isSelected и hasFocus, установить цвет текста и фона, активировать границу фокуса и т.д. Затем вы измените отображаемый текст, измените размер ячейки и return this.

Ответ 3

Использование setSelectionColor (Color.GREEN); вы говорите, что именно пользователь выбирает зеленый. Какова ваша проблема и что вы ожидаете от своего кода?