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

前端之家收集整理的这篇文章主要介绍了具有透明文本字段的Java Nimbus LAF前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个应用程序在几个地方使用禁用的JTextFields,这些地方是透明的 – 允许背景显示,而不是文本字段的正常背景.

当运行新的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); }

Example http://i41.tinypic.com/sviczq.png

alt text http://i44.tinypic.com/35d80ao.png

解决方法

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

nimbus opaque bug

对我有用的解决方法是:

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

从OP的注意事项:我也必须确保JTextField的setOpaque(false),以便父背景被画 – 只是想提及这些,跟随他们,以防他们已经尝试了setOpaque(true),就像我一样.

猜你在找的Java相关文章