这原来是这些问题之一:
- 认为这是一个很好的问题来演示如何在自定义渲染器中获得正确的依赖于状态的视觉属性
- 实施和测试一个简单的例子
- 没有按预期工作
- 启动调试会话
... 几个小时后 .. 对某些 Nimbus 的特殊性感到厌恶。
从正确的事情开始:在您的自定义渲染器(任何类型)中,引用表格的默认渲染器并使用默认属性配置自定义渲染组件。这样,您将自定义渲染组件看起来与默认组件(已选择、条带化、焦点...)相同,但您希望显式不同的状态除外
public static class TextAreaRenderer2 extends JTextArea implements
TableCellRenderer {
private TableCellRenderer delegate;
public TextAreaRenderer2(TableCellRenderer delegate) {
this.delegate = delegate;
// initial config
Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);
setFont(font);
setLineWrap(true);
setWrapStyleWord(true);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
// configure content
setText((String) value);
// get a configured component from the delegate
Component comp = delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
// configure myself as appropriate
setBackground(comp.getBackground());
setForeground(comp.getForeground());
setBorder(((JComponent) comp).getBorder());
return this;
}
}
这在每个核心 LAF 中看起来都不错……除了 Nimbus:我们在行中的区域周围有一个小的白色边框,带有备用颜色。乍一看似乎是一个不透明度缺陷,哦,是的 - 忘记明确将不透明度设置为 true
// initial config
...
setOpaque = true;
现在我们在正常颜色的行中的区域周围有一个小的黑色边框。奇怪的是,黑暗是视口的颜色- ?
在一天结束时(跳过几个小时:-) 事实证明 Nimbus 中的 textArea 有一个特殊的 ui 状态 NOTINSCROLLPANE。在那种状态下,TextAreaPainter 填充了一个减少了大约 2px 插图的区域(不知道为什么)。当不用于渲染时,将 opacity 设置为 true 足以使其填充整个区域。当用于渲染时,除了...将其添加到 JViewport(从而伪造状态)并将视口作为渲染组件返回(不知道为什么会有这种差异)之外,没有任何帮助。
public static class TextAreaRenderer2 extends JTextArea implements
TableCellRenderer {
private TableCellRenderer delegate;
JComponent parent;
public TextAreaRenderer2(TableCellRenderer delegate) {
this.delegate = delegate;
// initial config
Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);
setFont(font);
setLineWrap(true);
setWrapStyleWord(true);
parent = new JViewport();
parent.add(this);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
// configure content
setText((String) value);
// get a configured component from the delegate
Component comp = delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
// configure myself as appropriate
setBackground(comp.getBackground());
setForeground(comp.getForeground());
setBorder(((JComponent) comp).getBorder());
// return the viewport we are added to
return parent;
}
}