我使用Java和Swing。
我有两个窗口MainWindow
和PointWindow
。
MainWindow
是一个JFrame窗口。
PointWindow
延伸JWindow
。
我希望PointWindow
永远保持在最前面(永远不要在其他窗口或组件下)。我设置了PointWindow
和setAlwaysOnTop(true)
的构造函数,但问题是当我点击MainWindow
(焦点)时,接下来以不同的方式点击我的桌面(空白区域)并尝试拖动PointWindow
然后它就在我的MainWindow
。
有什么方法可以让PointWindow
始终位于所有组件之上?
修改
在构造函数中,我尝试使用WindowListener
,如下所示
this.addWindowListener(new WindowAdapter() {
@Override
public void windowDeactivated(WindowEvent e) {
toFront();
}
@Override
public void windowLostFocus(WindowEvent e) {
toFront();
}
});
......但它不起作用,事件没有被捕获
答案 0 :(得分:1)
如果两个窗口属于同一个应用程序,则
override func awakeFromNib() {
super.awakeFromNib()
if #available(OSX 10.12, *) {
tabbingMode = .disallowed
}
}
方法应该做,你想要什么。
如果您的窗口必须保持最佳状态,即使您的应用程序失去焦点,您也必须定期将其推回顶部。如果另一个窗口获得焦点,则无法控制,但您可以使用线程将窗口推回到顶部。
在以下示例中,fr是您的窗口
setAlwaysOnTop(true);
这段代码会每隔100毫秒将窗口推回到前面,对于大多数应用程序来说应该是这样。这不是最好的解决方案,但应该可行
修改强>
如果您只想让窗口位于其他窗口前(焦点恢复后的事件),您可以添加
当你的focusGained(FocusEvent e)事件触发时,一个FocusListener到你的JFrame并在你的窗口上调用.Front。
或您可以使用框架作为父级创建JWindow: 新的JWindow(jframeParent); 这样,您的JWindow将收到所有活动。
或只使用未修饰的JFrame代替JWindow
<强> EDIT2:强>
如果您只想让窗口位于顶部,当您点击它时,MouseListener是正确的方法。
答案 1 :(得分:0)
<强>解强>
我将MouseAdapter
作为MouseListener
添加到PointWindow
,当检测到mousePressed
事件时,执行toFront()
并正常工作但有一个副作用,这意味着有一个窗口隐藏和显示(非常快)的时刻。