gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:23:48 24 4
gpt4 key购买 nike

我有一个应用程序在几个地方使用禁用的 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); }

Example

alt text

最佳答案

我上周使用 JTextPane 遇到了同样的问题。 setOpaque() 方法在使用 nimbus 以外的任何外观时都按预期工作。显然,nimbus 的外观和感觉改变了我们对许多组件使用 setOpaque() 所期望的行为。取决于你如何看待它,它可以被认为是一个错误。查看关于这个 sun bugid 的评论:

nimbus opaque bug

对我有用的解决方法是:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com