我有一个应用程序,该应用程序在旨在透明的多个位置使用了禁用的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); }
最佳答案
上周,我使用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)。