Java Nimbus LAF与透明文本字段

Law*_*Dol 11 java swing nimbus

我有一个应用程序在几个地方使用禁用的JTextFields是透明的 - 允许显示背景而不是文本字段的正常背景.

运行新的Nimbus LAF时,这些字段是不透明的(尽管设置了setOpaque(false)),并且我的UI被破坏了.好像LAF忽略了不透明的属性.明确地设置背景颜色在几个地方都很困难,并且由于背景图像实际上不起作用而不是最佳 - 它仍然在顶部绘制LAF默认背景,留下类似边框的外观(下面的启动画面具有明确设置背景以匹配图像).

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

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

注意:我的后备位置是继续使用系统LAF,但Nimbus确实看起来好多了.

见下面的示例图片.


结论

这种行为的意外是由于对Nimbus错误报告中的setOpaque()意图做错误的解释:

这是Swing的原始设计以及它多年来一直令人困惑的问题.问题是setOpaque(false)在退出LAF时产生了副作用,即隐藏背景并不是真正的背景.可以说,我有透明部分和swing的组件应该在其后面绘制父组件.

不幸的是,Nimbus组件似乎也不尊重setBackground(null),否则这将是停止背景绘制的推荐方法.设置完全透明的背景对我来说似乎不直观.

在我看来,setOpaque()/ isOpaque()是一个错误的公共API选择,应该只有:

public boolean isFullyOpaque();
Run Code Online (Sandbox Code Playgroud)

我这样说,因为isOpaque()== true是与Swing的契约,组件子类将负责绘制它的整个背景 - 这意味着父级可以跳过绘制该区域(如果需要)(这是一个重要的性能增强).外部的东西不能直接改变这个合同(合法地),其履行可以编码到组件中.

因此,不应使用setOpaque()设置组件的不透明度.相反,像setBackground(null)这样的东西会导致许多组件"没有背景",因此变得不完全不透明.举例来说,在理想的世界中,大多数组件应该具有如下所示的isOpaque():

public boolean isOpaque() { return (background!=null); }
Run Code Online (Sandbox Code Playgroud)

示例http://i41.tinypic.com/sviczq.png

替代文字http://i44.tinypic.com/35d80ao.png

Gar*_*ary 17

我上周使用JTextPane遇到了同样的问题.当使用除nimbus之外的任何外观时,setOpaque()方法按预期工作.显然,灵气的外观和感觉改变了我们对许多组件的setOpaque()所期望的行为.根据您的看法,它可以被视为一个错误.检查这个sun bugid的评论:

雨云不透明的bug

对我有用的解决方法是:

myPane.setOpaque(false); // added by OP
myPane.setBorder(BorderFactory.createEmptyBorder());
myPane.setBackground(new Color(0,0,0,0));
Run Code Online (Sandbox Code Playgroud)

OP的注意事项:我还必须确保JTextField的setOpaque(false),以便绘制父背景 - 只是想为其他人提及这一点,以防他们尝试使用setOpaque(true),就像我一样.