java - 在 Java 8 中设置装饰 JFrame 的不透明度

标签 java swing java-8 jframe transparency

我想知道如何在最新 Java 版本中获得透明的JFrame

目前,您只能使用

<JFrame>.setOpacity();

如果框架未装饰

我不喜欢未装饰的框架,所以我想知道如何绕过这个限制并将框架的不透明度设置为 0.5f 同时保持标题栏,调整大小选项等

我在这里阅读了文档:http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html .该代码仅适用于 Java 6,不再运行。正如我所说,错误是:

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated
    at java.awt.Frame.setOpacity(Frame.java:960)
    at TranslucentWindowDemo$1.run(TranslucentWindowDemo.java:53)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    ...

我还尝试使用具有自定义 Alpha 值的 Color 设置背景 (setBackground : Color) (new Color(int, int, int, Alpha )) 但它抛出完全相同的错误。 以这种方式设置 JPanel 的透明性是行不通的,因为它仍然位于 JFrame 上,它不是透明的。

我在 Stack Overflow 上找不到其他正确解决此问题的答案。事实上,一些人建议可以通过以下方式解决这个问题:

JFrame.setDefaultLookAndFeelDecorated(true);

但他们被误导为可能指的是 Java 7,正如我测试过的那样,结果是一样的。

我也尝试过手动设置外观:

try {
    for (final LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
            UIManager.setLookAndFeel(info.getClassName());
            break;
        }
    }

} catch [...] 

将此与上面建议的解决方案结合起来也没有用。

请引用我上面链接的示例代码 ( Oracle doc ) 的 MCVE,因为这是我正在使用的示例。

有什么办法解决这个问题吗?

最佳答案

据我所知,基本答案是:不可能,至少系统外观。如 Is The Java Tutorials Translucent Window example giving trouble to those playing with jdk7? 所示, JavaDocs 明确指出 setOpacity() 的“窗口必须未修饰”去工作。

然而,可以使用(丑陋的)跨平台外观来做到这一点,您可以按如下方式进行编程设置:

UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());

事实上,由于可以通过配置覆盖跨平台外观,最安全的实际上是将其显式设置为 Metal,如下所示:

UIManager.setLookAndFeel(new MetalLookAndFeel());

之所以可行,是因为 Frame.setOpacity() 的 JDK 实现!isUndecorated() 时抛出异常, 和 JFrame.frameInit()当外观为 getSupportsWindowDecorations() 时,将自身设置为 未修饰返回 true。然后调用 getRootPane().setWindowDecorationStyle()JRootPane.FRAME , 表示装饰将由根 Pane 而不是框架提供。

据我在 JDK 中所见,Metal 外观和感觉是唯一一个 getSupportsWindowDecorations()返回 true,因为它是唯一一个覆盖它的,默认实现只返回 false

但是,一些第三方外观也支持它。例如 Tiny Look and Feel 就是这种情况。 ,正如我刚刚尝试的那样:

TranslucentWindowDemo with TinyLAF

(请注意,我在 Ubuntu 上截取了这个屏幕截图,TinyLAF 恰好有一个看起来像 Windows XP 的默认主题!)

另见 this question获取已知的第三方外观列表。

关于java - 在 Java 8 中设置装饰 JFrame 的不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538731/

相关文章:

Java 文本字段聚焦

添加到 JPanel 时,Java Swing 组件没有正确的大小

Java - Swing UI 独立的套接字逻辑

java - Java 8 中特殊 lambda 表达式的最短表示法

java - 嵌套 if-object-null-return 方法提取或替代 Sonar 认知复杂性

java - 如何按每个列表的第一个元素对 List<List<String>> 进行排序?

java - 如何在 CXF 拦截器上下文中使用 @Inject 或 @EJB?

java 8 - 循环的不可变映射

java - 使用 JSON 插入排序时遇到问题

java - LibGDX - 返回特定舞台坐标的所有 Actor