2

我使用 Java 的半透明形状窗口来创建类似于 Growl 的通知系统。基本上,屏幕右侧潜伏着一个不可见的始终在顶部的窗口,当通知进入时会添加到该窗口中。它可以按需要工作。

但是,如果我尝试单击位于此不可见窗口(最大 400 像素宽)范围内的另一个应用程序中的按钮,则单击事件会转到我的应用程序,这很奇怪,因为它是不可见的并且不做任何事情。这真的让我很困惑;我以为另一个应用程序已冻结。

有没有办法让其他应用程序“点击”我的应用程序?

我觉得这里不需要完整的 SSCCE,但这里有一段可能相关的代码:

// Set up frame: no border, etc. (undecorated); transparent.
frame.setUndecorated(true);
frame.setAlwaysOnTop(true);
frame.setResizable(false); // on Mac and maybe other platforms, even
                            // undecorated windows can be
                            // resized
AWTUtilities.setWindowOpaque(frame, false);

// Determine and set size and position.
// Height: maximized; width: maximized up to 400px.
Toolkit toolkit = Toolkit.getDefaultToolkit();
Insets insets = toolkit.getScreenInsets(frame
        .getGraphicsConfiguration());
Dimension screenSize = toolkit.getScreenSize();


Dimension availableSpace = new Dimension(screenSize.width - insets.left
        - insets.right, screenSize.height - insets.bottom - insets.top);

frame.setSize(new Dimension(
        400 > availableSpace.width ? availableSpace.width : 400,
        availableSpace.height));
frame.setLocation(screenSize.width - insets.right
        - frame.getSize().width, insets.top);

// Set the content of the frame to the datum holder.
frame.setContentPane(client.createPanel());

谢谢!

4

2 回答 2

3

请注意,此问题是在 Java7 - 适用于 Mac 的 Oracle 发行版中引入的。对于 Java6,它在 Mac 上运行良好。它也适用于所有 Windows 平台/java 版本。

也许他们有机会在以后的版本中解决这个问题?

于 2012-10-18T09:55:49.633 回答
2

仅仅因为您的窗口不透明/半透明并不意味着它不存在,因此,它仍在其范围内接收点击事件。

为什么不将您的窗口设置为在您不使用它时不可见,并且设置为在发布新通知时可见是通过使用:

window_instance.setVisible(false);//hides window
window_instance.setVisible(true);//shows window

您可能希望您的窗口在每个新通知发布到它后在短时间内保持可见,只需使用TimerandTimerTask并具有足够的 s 方法,如果它还没有,delay则在TimerTasksrun()方法中将窗口实例设置为不可见。

另请参阅此处以获取有关Timer's 的帮助:使用 Timer 和 TimerTask 类

于 2012-08-17T19:43:08.700 回答