我想知道如何在最新 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 就是这种情况。 ,正如我刚刚尝试的那样:
(请注意,我在 Ubuntu 上截取了这个屏幕截图,TinyLAF 恰好有一个看起来像 Windows XP 的默认主题!)
另见 this question获取已知的第三方外观列表。
关于java - 在 Java 8 中设置装饰 JFrame 的不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538731/