当运行新的Nimbus LAF时,这些字段是不透明的(尽管设置了setOpaque(false)),并且我的UI被破坏.就好像LAF忽略了不透明的属性.明确设置背景颜色在几个地方都是困难的,由于背景图片实际上不太适合 – 它仍然表现为顶部的LAF默认背景,留下了边框样的外观(下面的启动画面已经有背景明确设置为匹配图像).
任何关于如何让Nimbus不为JTextField绘制背景的想法?
注意:我需要一个JTextField,而不是一个JLabel,因为我需要线程安全的setText()和包装功能.
注意:我的后备位置是继续使用系统LAF,但Nimbus看起来更好看.
参见下面的示例图.
结论
在这种行为上的惊喜是由于对SetOpaque()打算做的事情的误解 – 来自Nimbus的错误报告:
This is a problem the the orginal design of Swing and how it has been confusing for years. The issue is setOpaque(false) has had a side effect in exiting LAFs which is that of hiding the background which is not really what it is ment for. It is ment to say that the component my have transparent parts and swing should paint the parent component behind it.
不幸的是,Nimbus组件也似乎不符合setBackground(null),否则这将是推荐的停止背景绘画的方法.设置一个完全透明的背景似乎是不直观的.
在我看来,setOpaque()/ isOpaque()是一个错误的公共API选择,应该只有:
public boolean isFullyOpaque();
我说这个,因为isOpaque()== true是与Swing的合同,组件子类将负责绘制它的整个背景 – 这意味着父代可以跳过绘制该区域(这是一个重要的性能增强).外部事务不能直接改变合同(合法),其履行可以被编码到组件中.
所以组件的不透明度不应该使用setOpaque()来设置.相反,像setBackground(null)这样的东西应该会导致许多组件“不具有背景”,因此变得不完全不透明.举个例子,在理想的世界中,大多数组件应该有一个如下所示的isOpaque():
public boolean isOpaque() { return (background!=null); }
解决方法
对我有用的解决方法是:
myPane.setOpaque(false); // added by OP myPane.setBorder(BorderFactory.createEmptyBorder()); myPane.setBackground(new Color(0,0));
从OP的注意事项:我也必须确保JTextField的setOpaque(false),以便父背景被画 – 只是想提及这些,跟随他们,以防他们已经尝试了setOpaque(true),就像我一样.