【问题标题】:Clicking Past a Transparent Frame (Java)单击透明框架 (Java)
【发布时间】:2012-09-13 11:58:01
【问题描述】:

我正在尝试用 Java (Swing) 开发一个应用程序,它可以让我在屏幕上叠加一个网格,并能够单击网格后面的东西——例如,桌面上的图标。

我会使用透明 JFrame 还是透明 JWindow 来解决这个问题?

无论我使用什么,透明窗口/框架都需要

  • 始终处于领先地位。
  • 占据整个屏幕。
  • 使用鼠标监听器注册每次点击。
  • 记录点击在屏幕上的坐标。
  • 请允许我使用 Graphics 类在屏幕上绘制一个网格,以及其他元素,如数字或图像,也应该单击它们。

任何方向都将不胜感激。

抱歉,如果我不够具体,但我还没有找到可以完成所有这些事情的演示窗口或框架。有一个例子hereanother here——但我不知道如何在Eclipse 中使用WindowUtils。这是我第一次进行 GUI 开发,除了基本的 Java 类之外,我从未使用过外部库。

【问题讨论】:

    标签: java jframe transparent jna


    【解决方案1】:
    • 最重要的是:Frame.setAlwaysOnTop() 应该适合你
    • 全屏:设置窗口大小为显示大小会占据整个屏幕
    • 事件和覆盖绘制:实际行为可能因平台而异,但通常如果您使用 alpha 组件绘制到窗口中,并且窗口名义上是透明的,则那些未绘制的区域(或有时绘制在某个 alpha 阈值)会将事件传递到下面的任何应用程序、窗口或组件。
      如果您捕获事件,则必须将它们重新引入到您下方的任何窗口中,这是非常重要的。如果您不捕获事件,则需要安装特定于操作系统的事件处理程序来捕获感兴趣的事件。

    JNA 的 WindowUtils.setWindowTransparent() 应该提供所需的绘制/事件行为,或者您可以使用较新的 JVM 版本中提供的 AWTUtils 等效项。

    【讨论】:

    • 我不确定您所说的第三个项目符号是什么意思。如果我使用 Java Graphics 类在 Frame 中绘制东西,点击会通过 Graphic 元素吗?附带说明一下,我已经使用 WindowUtils 获得了透明度,但我仍然不知道如何在透明框架上绘制东西。
    • 在一般情况下,您绘制的区域会收到事件。您不(透明)的区域将允许事件通过。 YMMV。
    • 请记住,JPanels 默认是不透明的,这意味着它们会绘制背景。您需要的内容要么自己绘制背景(并且不绘制任何内容),要么将任何不透明的祖先设置为 setOpaque(false)
    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 2023-03-31
    • 2011-03-06
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2020-02-15
    • 2011-04-09
    相关资源
    最近更新 更多