【问题标题】:make a glossy JFrame and JDialog制作一个有光泽的 JFrame 和 JDialog
【发布时间】:2015-07-03 22:26:51
【问题描述】:

我正在阅读 java 文档,发现只要平台支持这样的功能,就可以很容易地制作一个形状的窗口,使它们成为半透明和彩色的,但我找不到任何关于使它们有光泽的东西。

是否有可能在 awt 或只是摇摆中为框架或面板赋予金属外观?

我知道从跨平台的角度来看这可能是一个可怕的想法,但我想知道是否可以在不求助于某些第三方库的情况下以某种方式实现?

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

我一直在研究 JavaFX,但它似乎是一个庞大的多功能包 - 如果我只想要一个眼睛糖果,那就有点过头了。

注意 - 如果你给了一个减号,请解释为什么 - 否则它只是一个混蛋。我认为这篇文章没有任何问题,并且我确实指出了我所看到的内容。据我所知,我已经满足了所有正式要求,这不是一个主观类型的问题。

【问题讨论】:

  • 在关闭之前,请考虑该请求是有效的,并且来自模仿某些标准 Windows 7 元素外观的意愿。

标签: java swing user-interface awt


【解决方案1】:

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

很久以前,我尝试使用 Swing 来模拟玻璃(AKA Aero/Frost)效果。这是部分可能的。只要在 Java 端进行绘图,就可以轻松编写处理此问题的绘图代码(并且令人惊讶地甚至非常高效)。

这在 Swing 中是可能的(请参阅 Glass effect for internal panes),而使用 JavaFX 应该更简单。

但是,要处理您的精确请求 - 窗口边框 - 必须使用本机 WinApi。根据我的小研究,我只发现 SWT 以有限的方式执行此操作(但不公开为可公开访问的方法)。

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

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

【讨论】:

  • 如果我设置setUndecorated(true) 会怎样——这应该会移除窗口装饰器和边框——是否可以创建解决swing 限制的工作?我可以删除默认系统窗口,放置图像按钮而不是系统按钮 - 我可以通过 this.getContentPane().setBackground(Color.GREEN); 设置颜色,最后添加 frameScore.setOpacity(0.7f); 唯一的缺少的东西将是玻璃或金属的闪亮效果
  • 是的,所以我隐约记得这里有一个问题:DWM 使用一种特殊的颜色来标记被视为玻璃的东西。那是问题 #1,让 Swing 使用背景颜色。需要指示挥杆与背景颜色混合,以获得您想要的效果。我记得有一些很大的麻烦。
  • 所以我唯一的选择是求助于拥有自己的窗口渲染器的大型库,并在面板中创建类似于虚拟窗口的东西,或者在牺牲透明度的同时应用纹理?
  • 老实说,我不太确定你想要达到什么目的。如果涉及“windows native glass”效果,那么是的 - 除了以某种方式调用 WinApi 之外,您别无选择。以这种方式无法实现另一种效果——金属效果。你有想要达到的效果的参考截图吗?
  • 抱歉耽搁了,这个周末我不得不拆机 - 好吧,我想要这样的东西:elevator panel 注意金属饰面和光滑的按钮
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 2011-07-29
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2022-12-03
  • 2015-06-30
相关资源
最近更新 更多