当运行新的Nimbus LAF时,这些字段是不透明的(尽管设置了setOpaque(false)),我的UI就会崩溃。就好像LAF忽略了opaque属性一样。在几个地方明确设置背景颜色很困难,并且由于背景图像不太理想,实际上不起作用 - 它仍然在顶部绘制其默认的LAF背景,留下类似边框的外观(下面的启动画面已将背景明确设置为与图像匹配)。
有任何想法如何使Nimbus不为JTextField绘制背景?
注意:我需要JTextField而不是JLabel,因为我需要线程安全的setText()和包装功能。
注意:我的退路是继续使用系统LAF,但是Nimbus看起来更好。
请参见下面的示例图像。
结论
对此行为的“惊讶”是由于对setOpaque()的含义误解造成的 - 来自Nimbus错误报告:
这是Swing原始设计的问题,多年来一直令人困惑。问题在于setOpaque(false)在存在的LAF中具有隐藏背景的副作用,这实际上不是它的目的。它意味着该组件可能具有透明部分,Swing应该在其后面绘制父组件。
令人遗憾的是,Nimbus组件似乎也没有遵守setBackground(null),否则这将是停止背景绘制的推荐方法。对我来说,设置完全透明的背景似乎不直观。
在我看来,setOpaque()/isOpaque()是一个错误的公共API选择,本应只有:
public boolean isFullyOpaque();
我之所以这么说,是因为isOpaque() == true是与Swing的契约,即组件子类将负责绘制其整个背景,这意味着父级可以跳过绘制该区域(这是一个重要的性能增强)。外部的某些东西不能直接更改此契约(合法地),因为其履行可能已编码到组件中。因此,组件的不透明度不应该使用setOpaque()进行设置。相反,诸如setBackground(null)之类的操作会导致许多组件“没有背景”,从而变得不完全不透明。例如,在理想情况下,大多数组件的isOpaque()应该如下所示:
public boolean isOpaque() { return (background!=null); }