Почему мой пользовательский рендерер ячеек Java не показывает подсветку при выборе строки / ячейки? - PullRequest
10 голосов
/ 05 апреля 2011

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

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, он отображает только подсветку для не пользовательскихоказанные клетки.Подсветка показывает все остальные ячейки для этой строки.Это оставляет только одну ячейку с белым фоном, в то время как остальная часть строки имеет синий (в моем случае) в качестве выделенного цвета фона.

Ответы [ 3 ]

13 голосов
/ 06 апреля 2011

Вы должны проверить аргумент 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;
    }
3 голосов
/ 06 апреля 2011

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

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.

0 голосов
/ 05 апреля 2011

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

...