我使用Java和Swing。

我有两个窗口MainWindowPointWindow

MainWindow是一个JFrame窗口。

PointWindow扩展JWindow

我想始终将PointWindow放在顶部(永远不要在其他窗口或组件下方)。我在PointWindowsetAlwaysOnTop(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是正确的方法。

09-15 14:27