Joe*_*ton 6 java swing transparency jframe java-8
我想知道如何JFrame
在最新版本的Java中获得透明.
目前,您只能使用
<JFrame>.setOpacity();
Run Code Online (Sandbox Code Playgroud)
如果框架没有装饰.
我没有使用未装饰的框架,所以我想知道如何绕过这个限制并设置框架的不透明度,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)
...
Run Code Online (Sandbox Code Playgroud)
我也尝试(setBackground : Color)
使用Color
自定义Alpha值(new Color(int, int, int, Alpha)
)设置背景但它会抛出完全相同的错误.设置JPanel
这种方式的跨性别是行不通的,因为它仍然存在JFrame
,这是不透明的.
我找不到正确解决此问题的Stack Overflow上的其他答案.事实上,一些人认为这可以通过以下方式解决:
JFrame.setDefaultLookAndFeelDecorated(true);
Run Code Online (Sandbox Code Playgroud)
但他们误解了可能是指Java 7,因为我测试了它,结果是一样的.
我也尝试手动设置外观:
try {
for (final LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch [...]
Run Code Online (Sandbox Code Playgroud)
将此与上面提出的解决方案相结合也行不通.
请参考我上面链接的示例代码(Oracle doc)以获取MCVE,因为这是我正在使用的代码.
有什么方法吗?
据我所知,基本答案是:这是不可能的,至少对于系统外观而言是不可能的。如Java教程的“半透明窗口”示例是否给使用jdk7的用户带来麻烦?,JavaDocs明确指出“ 该窗口必须未装饰 ” setOpacity()
才能正常工作。
但是,可以使用(丑陋的)跨平台外观来做到这一点,您可以按如下方式进行编程设置:
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
Run Code Online (Sandbox Code Playgroud)
实际上,由于跨平台的外观可以通过配置来覆盖,因此最安全的方法实际上是将其显式设置为Metal,如下所示:
UIManager.setLookAndFeel(new MetalLookAndFeel());
Run Code Online (Sandbox Code Playgroud)
之所以起作用,是因为JDK实现在时Frame.setOpacity()
抛出异常!isUndecorated()
,并在返回外观时JFrame.frameInit()
将自身设置为未修饰。然后它调用的getRootPane()。setWindowDecorationStyle()与,表明装饰品将由根窗格,而不是框架来提供。getSupportsWindowDecorations()
true
JRootPane.FRAME
从我在JDK中可以看到,Metal外观是唯一为其getSupportsWindowDecorations()
返回的外观true
,因为它是唯一覆盖它的外观,并且默认实现只是返回false
。
但是,某些第三方外观也支持它。在我刚刚尝试过的情况下,例如Tiny Look and Feel就是这种情况:
(请注意,我是在Ubuntu,TinyLAF上截取此屏幕截图的,碰巧它的默认主题类似于Windows XP!)
另请参阅此问题,以获取已知的第三方外观的列表。