我使用了java和swing。
我有两个Windows MainWindow
和PointWindow
。
MainWindow
是一个jframe窗口。
PointWindow
扩展了JWindow
。
我想将PointWindow
始终保持在顶部(从来没有在其他窗口或组件下)。我在 PointWindow
a setAlwaysOnTop(true)
的构造函数中设置,但问题是当我单击到 MainWindow
(focus)(焦点)时,下一个以不同的方式点击我的桌面(空空间),然后尝试拖动 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();
}
}
}
此代码将使您的窗口每100毫秒向前推回最前面,对于大多数应用程序来说,这应该是一个变态。这不是最好的解决方案,但应该起作用
编辑:
如果您只想到窗口在另一个窗口的前面(焦点重新恢复后的事件),则可以添加和
当聚焦(focusevent e)fired fire时,您的jframe焦点列表并在窗口上调用tofront。
或您可以用框架创建jwindow作为父:新Jwindow(jframeparent);这样,您的jwindow将收到所有事件。
或仅使用未装饰的Jframe而不是Jwindow
edit2:
如果您只希望窗口在顶部,则单击它,Mouselistener是正确的方法。
解决方案
我将MouseAdapter
作为MouseListener
添加到PointWindow
,当检测到mousePressed
事件时,然后进行toFront()
并工作正常,但有一个副作用,这意味着有一个时刻的时刻,窗口是隐藏和显示的(非常快)。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>