我使用Java的translucent and shaped windows来创建类似于Growl的通知系统。基本上,屏幕右侧隐藏着一个隐藏的永远在顶的窗口,当它们进入时会添加通知。它可以根据需要工作。
但是,如果我尝试单击位于此不可见窗口范围内的另一个应用程序中的按钮(最大宽度为400px),则单击事件将转到我的应用程序,这很奇怪,因为它是不可见的,什么都不做这让我很困惑;我以为其他应用程序已经冻结了。
我有办法允许其他应用程序“点击”我的应用程序吗?
我觉得这里不需要完整的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());
谢谢!
答案 0 :(得分:3)
请注意,此问题是在Java7中引入的 - 适用于Mac的Oracle发行版。对于Java6,它在Mac上运行良好。它也适用于所有Windows平台/ java版本。
也许他们有可能在进一步的版本中解决这个问题?
答案 1 :(得分:2)
仅仅因为你的窗口不透明/半透明并不意味着它不存在,因此,它仍然在其范围内接收点击事件。
为什么不在不使用窗口时将窗口设置为不可见,并在发布新通知时显示设置:
window_instance.setVisible(false);//hides window
window_instance.setVisible(true);//shows window
您可能希望自己的每个新通知发布后,您的窗口会在短时间内保持可见状态,只需使用Timer
和TimerTask
,并且内部有足够的delay
TimerTask
run()
方法将窗口实例设置为不可见(如果尚未显示)。
另请参阅此处获取Timer
的帮助:Using the Timer and TimerTask Classes