制作有光泽的JFrame和JDialog

时间:2015-07-01 10:08:48

标签: java swing user-interface awt

我正在阅读java文档,发现只要平台支持这样的功能,很容易制作成型的窗户,使它们半透明和有色,但我找不到任何关于使它们有光泽的内容。 / p>

是否可以在awt或只是摆动时为框架或面板提供金属外观?

我知道从跨平台的角度来看这可能是一个可怕的想法,但我想知道是否有可能以某种方式不使用某些第三方库?

我在这里找到了一个按钮光泽示例: http://www.andygibson.net/blog/tutorial/glass-button-tutorial-in-java/ 但它并不完全是金属外观,如果我复制方法使用矩形而不是圆形,它可能会缩小。

我一直在关注JavaFX,但它似乎是一个庞大的多功能包 - 如果我只想要一个眼圈,那就太过分了。

注意 - 如果你给出一个减号,那么解释为什么这么好 - 否则它只是一个混蛋。我认为这篇文章没有错,我确实指出了我的看法。从我看到的我已经满足所有形式要求,这不是一个主观的问题类型。

1 个答案:

答案 0 :(得分:1)

您的请求只能通过调用Windows本机API来处理。您必须与Windows DWM(桌面Windows管理器)工具合作。通常,它通过调用DwmExtendFrameIntoClientArea function来处理。

MSDN Sample for Sheet of Glass effect

很久以前,我试图使用Swing模仿玻璃(AKA Aero / Frost)效果。这部分是可能的。人们可以很容易地编写处理这个的绘图代码(并且令人惊讶地甚至非常高效),只要绘图发生在Java端。

使用Swing可以实现这一点(参见Glass effect for internal panes),使用JavaFX应该更简单。

但是,要处理您的精确请求 - 窗口边框 - 必须使用本机WinApi。从我的小研究中,我只发现SWT以有限的方式做到这一点(但不公开作为公共可访问的方法)。

我试图通过JNA项目调用Windows Shell API。我成功地改变了玻璃区域,但效果令人不快:Swing没有做好准备(~JDK 7u5)来处理部分透明的JFrame。我记得,在重绘过程​​中,JFrame代码是使用某种颜色清除Window。我不得不强行将其更改为其他的(与我通过调用Windows API指定的那个匹配),但最终导致视觉混乱。

我尝试调试它,我发现某些版本的Java有不同的代码来清除JFrame的内容。因此,即使我设法正确设置了所需的颜色,它也很容易打破JDK更新。