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

Если вы хотите добавить пользовательский рендер, обычно вы либо расширяете 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 header background.На самом деле, я очень сомневаюсь, что получу собственный стиль заголовка, просто собственный стиль JPanel.

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

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

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

0 голосов
/ 11 апреля 2013

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

        fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground");
        bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");
...