我有一个应用程序,该应用程序在旨在透明的多个位置使用了禁用的JTextFields-允许显示背景,而不是显示文本字段的普通背景。

当运行新的Nimbus LAF时,这些字段是不透明的(尽管设置为setOpaque(false)),并且我的UI损坏了。好像LAF忽略了opaque属性。显式地设置背景色在多个地方都很困难,并且由于背景图像实际上不起作用而不能达到最佳效果-它仍然在顶部绘制LAF默认背景,留下类似边框的外观(下面的启动屏幕具有明确设置为与图片匹配的背景)。

关于如何使Nimbus不绘制JTextField背景的任何想法?

注意:我需要一个JTextField而不是JLabel,因为我需要线程安全的setText()和包装功能。

注意:我的后备职位是继续使用系统LAF,但是Nimbus的确好得多。

请参阅下面的示例图像。

结论

这种行为的惊奇之处是由于对Nitrobus错误报告的setOpaque()含义的误解:



不幸的是,Nimbus组件似乎也没有遵守setBackground(null),否则这将是建议的停止背景绘画的方法。设置完全透明的背景对我来说似乎并不直观。

我认为setOpaque()/isOpaque()是一个错误的公共(public)API选择,应该仅是:

public boolean isFullyOpaque();

我这样说是因为isOpaque()== true是与Swing签订的契约(Contract),该组件子类将负责绘画整个背景-这意味着父级可以根据需要跳过该区域的绘画(这是重要的性能增强)。外部的某些事物不能直接(合法地)更改此契约(Contract),契约(Contract)的履行可以被编码到组件中。

因此,不应使用setOpaque()设置组件的不透明度。而是类似setBackground(null)之类的东西应该使许多组件“没有背景”,因此变得不完全不透明。举例来说,在理想情况下,大多数组件都应具有如下所示的isOpaque():
public boolean isOpaque() { return (background!=null); }

具有透明文本字段的Java Nimbus LAF-LMLPHP

具有透明文本字段的Java Nimbus LAF-LMLPHP

最佳答案

上周,我使用JTextPane遇到了同样的问题。当使用除nimbus之外的任何外观时,setOpaque()方法将按预期工作。显然,灵气的外观改变了我们对于许多组件的setOpaque()期望的行为。根据您的看法,可以将其视为错误。检查关于此太阳小动物的评论:

nimbus opaque bug

对我有用的解决方法是:

myPane.setOpaque(false); // added by OP
myPane.setBorder(BorderFactory.createEmptyBorder());
myPane.setBackground(new Color(0,0,0,0));

OP的注意事项:我还必须确保JTextField的setOpaque(false)才能绘制父背景-只是想为其他跟随我的人提一下这一点,以防其他人像我一样尝试过setOpaque(true)。

09-26 12:17