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");