Как получить полную подсветку (с рамкой) на JTable Renderer - PullRequest
1 голос
/ 02 июня 2011

Существует общий метод при использовании JTable TableCellRenderers для установки фона и переднего плана при выборе ячейки.Вот пример вопроса, который был задан:

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

В этом решении отсутствует одинвещь ... граница вокруг клетки.(Обратите внимание, что я не спрашиваю о границе вокруг строки, как было задано здесь .) Граница должна выделяться при выборе ячейки.Недопустимо просто создавать свою собственную границу и устанавливать ее, потому что создаваемая вами граница может не вписываться в Look & Feel.

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

private final DefaultTableCellRenderer defTblRend = new DefaultTableCellRenderer();
private final JComponent renderer = new ComplexCell(); // Whatever object type extends JComponent
@Override public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row,
    int column)
{
    // ... Set values on "renderer" object here ...
    renderer.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
    renderer.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
    renderer.setOpaque(!renderer.getBackground().equals(table.getBackground()));
    JComponent comp = (JComponent)defTblRend.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    renderer.setBorder(comp.getBorder());
    return renderer;
}

Есть ли лучший способ?

1 Ответ

2 голосов
/ 02 июня 2011

Возможно, вы сможете использовать UIManager. См. UIManager по умолчанию . «Table.focusCellHighlightBorder» может оказаться тем свойством, которое вам нужно.

ДОБАВЛЕНО ОРИГИНАЛЬНЫМ ПОСТЕРОМ:

Вот решение, которое я придумал, основываясь на информации camickr. Оптимизация / очистка приветствуется.

  1. Установите статические границы, чтобы они были доступны везде, где они вам нужны (я поместил их в класс с именем "UiUtils"):

    public static final Border focusedCellBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
    public static final Border unfocusedCellBorder = createEmptyBorder();
    private static Border createEmptyBorder()
    {
        Insets i = focusedCellBorder.getBorderInsets(new JLabel());
        return BorderFactory.createEmptyBorder(i.top, i.left, i.bottom, i.right);
    }
    
  2. Renderer

    @Override public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column)
    {
        // [... set component values here ...]
        label.setBorder(hasFocus ? UiUtils.focusedCellBorder : UiUtils.unfocusedCellBorder);
        return label;
    }
    
...