Если вы хотите добавить пользовательский рендер, обычно вы либо расширяете 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.
Спасибо!