- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个应用程序在几个地方使用禁用的 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() 是一个错误的公共(public) API 选择,它应该只是:
public boolean isFullyOpaque();
我这样说,因为 isOpaque()==true 是与 Swing 的约定,组件子类将负责绘制它的整个背景——这意味着父类可以根据需要跳过绘制该区域(这是一个重要的性能增强)。外部事物不能直接(合法地)改变这个契约,它的实现可以编码到组件中。
所以组件的不透明度不应该使用 setOpaque() 来设置。相反,像 setBackground(null) 这样的东西应该会导致许多组件“没有背景”,因此变得不完全不透明。举例来说,在理想的世界中,大多数组件应该有一个 isOpaque() 看起来像这样:
public boolean isOpaque() { return (background!=null); }
最佳答案
我上周使用 JTextPane 遇到了同样的问题。 setOpaque() 方法在使用 nimbus 以外的任何外观时都按预期工作。显然,nimbus 的外观和感觉改变了我们对许多组件使用 setOpaque() 所期望的行为。取决于你如何看待它,它可以被认为是一个错误。查看关于这个 sun bugid 的评论:
对我有用的解决方法是:
myPane.setOpaque(false); // added by OP
myPane.setBorder(BorderFactory.createEmptyBorder());
myPane.setBackground(new Color(0,0,0,0));
来自 OP 的注释:我还必须确保 JTextField 的 setOpaque(false) 以便绘制父背景 - 只是想向其他跟随者提及这一点,以防他们像我一样尝试过 setOpaque(true)。
关于具有透明文本字段的 Java Nimbus LAF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/613603/
例如,可能有不同的 LAF。 JPanel 及其所有子项? 我的程序的核心(全部在一个 JPanel 中)严重依赖于组件的高度和宽度(通过不同的 LAF 进行更改),因此必须有一个恒定的 LAF。其余
我自定义我的 JComboBox 如下。 该程序在默认 LAF 下运行正常,但是每当我将 LAF 更改为 System LAF(另一个 LAF,Nimbus 也可以)时,单击按钮后就会出现无限循环。我
我有一个用 Java 编写的应用程序。当我使用跨平台 LAF(金属)从 eclipse 运行它时UIManager.setLookAndFeel(UIManager.getCrossPlatformL
我正在 Netbeans 中构建一个 GUI,它在设计器中看起来不错,但当我运行该程序时,它看起来很垃圾。我使用的是 Mac,所以我觉得使用 Mac OS LAF 看起来会更好,但是当我在 Windo
在我编写的“Battleship”程序中,我包含了将程序的“外观和感觉”更改为 SystemDefault、“Metal”(Java 默认)或“Motif”(也包含在 Java 中)的可能性。如果您从
我正在使用 Netbeans IDE,并且我想在 Java 应用程序中使用 Insubstantial LAF (http://insubstantial.posterous.com/)。但是,我不知
我有一个带有两个 JPanel 的应用程序,它们必须具有不同的样式。我使用 Synth LaF,但我不知道如何在一个 xml 文件中拥有两种不同的样式。我定义了一种样式并将其绑定(bind)到“面板”
我们在带有Solaris的服务器上运行构建。将 jre 1.6 更改为 jre 1.7 后,运行所有测试的实用程序开始抛出异常(抱歉我的英语): [java] Exception in thread
我是 Java 的新手,我搜索了很多网络和 Java 文档,但我不明白如何将 JTatto LAF 集成到我的应用程序中。 我下载了 .jar 文件并将其保存到我的类(class)所在的同一文件夹中。
我有一个应用程序在几个地方使用禁用的 JTextFields,这些地方是透明的 - 允许显示背景而不是文本字段的正常背景。 当运行新的 Nimbus LAF 时,这些字段是不透明的(尽管设置了 set
当我使用 Nimbus 外观时,我在 addPropertyChangeListener 处收到 NullpointerException 。当我使用 Linux 标准 LAF(金属)时,一切工作正常
如何子类化 JTabbedPane 并为子类的每个实例提供与默认 LaF 不同的外观?我仍然想访问默认的 JTabbedPanel,因此简单地覆盖全局 LaF 不是一个选项。 谢谢。 最佳答案 您可以
使用 Synth LaF,我无法将 JLabel 的前景颜色设置为“禁用”状态。有人成功做到这一点吗?这是 LaF.xml 文件中标签的样式定义。
我想删除 LAF JCheckbox 周围的蓝色东西: 我该怎么做? 非常感谢 最佳答案 图标是 LAF 的一部分。 如果您不喜欢默认图标,那么您可以随时提供自己的图标: checkBox.setIc
如何从 Swing JComboBox 中删除 LAF 样式? 最佳答案 实际上您无法删除 LAF,因为那时不会呈现任何内容,但您可以仅为该组合框设置另一个 LAF。 像这样: combo.setUI
我正在通过动态更改 UIDefaults 来自定义 Swing 应用程序。最终目标是更改其中的许多内容(颜色、字体、大小、边框等)并根据每个用户保存结果。虽然它可能会给应用程序带来一些非标准的外观,但
我最近一直在尝试将系统转换为统一的外观和感觉(在本例中为 Nimbus)。然而,某些组件需要更改默认值,我不想仅仅因为单个组件而更改默认值。 我正在尝试覆盖 JTree 组件的行突出显示颜色。我已经设
我目前正在使用 swing 应用程序。对于开发人员来说,最重要的是用户必须熟悉 GUI。我想开发一个应用程序,它可以具有所有平台的 native (平台的默认)外观在计算机上使用的(我的意思是说我的应
最近我一直在使用 Nimbus Look and Feel 开发一个 Swing 项目。我想将 JOptionPane 中的所有按钮设置为具有相同的大小,但徒劳无功。 import javax.swi
我刚刚注意到,当我在第二个屏幕(没有任务栏)上最大化一个框架时,它最终会达到人们预期的边界(如果任务栏在那里)。 我刚刚注意到这一点已经切换到 Windows 7。以前在 Vista 中,我有一个实用
我是一名优秀的程序员,十分优秀!