我使用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();
}
});
...但是它不起作用,没有捕获事件
最佳答案
如果两个窗口都属于同一应用程序,则
setAlwaysOnTop(true);
方法应该做什么,想要什么。
如果您的窗口必须停留在顶部,即使您的应用程序失去了焦点,您也必须定期将其推回顶部。如果另一个窗口成为焦点,则无法控制,但可以使用线程将窗口推回顶部。
在下面的示例中,fr是您的窗口
Thread th = new Thread(){
public void run(){
boolean live = true;
while(live){
try{
fr.toFront();
fr.setAlwaysOnTop(true);
}catch(Exception e1){
e1.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
此代码将每100ms将窗口推回前端,对于大多数应用程序来说应该足够了。这不是最好的解决方案,但它应该可以工作
编辑:
如果您只是想让该窗口位于其他窗口的前面(重新获得焦点后的事件),则可以添加和
当focusGained(FocusEvent e)事件触发时,对JFrame进行FocusListener调用并在窗口上调用toFront。
或者,您可以将框架作为父级来创建JWindow:
新的JWindow(jframeParent);
这样,您的JWindow将接收所有事件。
或者只使用未装饰的JFrame而不是JWindow
编辑2:
如果只希望窗口位于顶部,则单击它时,MouseListener是正确的方法。