Java: переопределить средство визуализации ячеек таблицы, но с фоном и свойствами по умолчанию

Если вы хотите добавить пользовательский рендерер, обычно вы можете расширить JComponent (лайк JLabel) и реализовать TableCellRendererили вы бы продлили DefaultTableCellRenderer, Однако в любом случае я обнаружил, что стиль ячейки полностью переопределен.

Что мне действительно нравится, так это возможность рисовать фон L&F по умолчанию, а затем рисовать поверх него, используя другие значения по умолчанию L&F, такие как цвет переднего плана и шрифт.

Итак, вот что я пытался сделать. Во-первых, класс:

public class IntervalHeaderRenderer extends JLabel implements TableCellRenderer {

    private TableCellRenderer delegate;
    private Component component;

    public IntervalHeaderRenderer(TableCellRenderer defaultRenderer)
    {
        this.delegate = defaultRenderer;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                           boolean isSelected, boolean hasFocus, int row, int column)
    {
        component = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Maybe override some settings.  
        // You could make the label bold, for instance.

        return component;
        // return this;
    }

    @Override
    public void paint(Graphics g) {
        // What I really want to do is paint the original component
        component.paint(g);
        // And then draw on top of it.
    }
}

И тогда я переопределяю рендерер ячейки (заголовка) следующим образом:

TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
table.getColumnModel().getColumn(1).setHeaderRenderer(new IntervalHeaderRenderer(renderer));

Я в основном просто следую советам здесь: TableCellRenderer, часть 2 - Как создать пользовательский рендер

Если я вернусь componentЭто выглядит так, как будто я ничего не переопределил. То есть я получаю заголовок с меткой, которую я запрограммировал, с выбранным фоном и стилем L&F и всем прочим. Но, конечно, потом не было возможности отрисовать мои вещи.

С другой стороны, если я вернусь thisтогда я абсолютно ничего не получаю. Mac родной L&F дает мне белый фон, в то время как Nimbus дает мне твердое вещество какого-то другого цвета.

Я явно что-то упускаю. Есть ли другие методы на Component что мне нужно переопределить и переслать в оригинал? Как нарисовать компонент по умолчанию, если не переопределить paint? (Я также пытался переопределить paintComponent, Нет разницы.)

Есть ли другой способ сделать это? Я думал о попытке отбросить родной стиль JPanel тут же сделать собственный (прозрачный фон) компонент его дочерним, хотя я не уверен, как это сделать, и я не совсем уверен, получу ли я собственный фон заголовка таблицы L&F. На самом деле, я очень сомневаюсь, что получу собственный стиль заголовка, просто родной JPanel стиль.

По сути, мне нужен пользовательский заголовок таблицы (и отдельно, на самом деле, тоже ячейки), но я хочу избегать слишком много путаться с нативным L&F.

Спасибо!

2 ответа

Решение

Вы можете посмотреть на подход, принятый в updateUI() в SelectAllHeaderTest, а также полезные замечания в принятом ответе.

Приложение. В качестве пояснения обратите внимание, что внешний вид заголовка находится под эгидой соответствующего делегата пользовательского интерфейса платформы хоста, обычно получаемого из TableHeaderUI, Возможно, вы захотите ограничить ваши изменения настройками UIManager по умолчанию, общими для популярных реализаций Look & Feel. Кроме того, не переопределяйте paint(), Я бы избежал переопределения paintComponent(); и, если необходимо, переопределить paintIcon(), как показано в TableSorter,

Проверить DefaultTableCellRenderer Исходный код, вы увидите, как поведение по умолчанию считывает цвета по умолчанию, например:

        fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground");
        bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");
Другие вопросы по тегам