具有透明文本字段的Java Nimbus LAF
我有一个应用程序在几个地方使用禁用的JTextFields,这些地方是透明的 – 允许背景显示,而不是文本字段的正常背景.
当运行新的Nimbus LAF时,这些字段是不透明的(尽管设置了setOpaque(false)),并且我的UI被破坏.就好像LAF忽略了不透明的属性.明确设置背景颜色在几个地方都是困难的,由于背景图片实际上不太适合 – 它仍然表现为顶部的LAF默认背景,留下了边框样的外观(下面的启动画面已经有背景明确设置为匹配图像). 任何关于如何让Nimbus不为JTextField绘制背景的想法? 注意:我需要一个JTextField,而不是一个JLabel,因为我需要线程安全的setText()和包装功能. 注意:我的后备位置是继续使用系统LAF,但Nimbus看起来更好看. 参见下面的示例图. 结论 在这种行为上的惊喜是由于对SetOpaque()打算做的事情的误解 – 来自Nimbus的错误报告:
不幸的是,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),就像我一样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |