JWindow 总是在最前面

JWindow always on top

我使用了 Java 和 Swing。

我有两个 windows MainWindowPointWindow

MainWindow 是一个 JFrame window.

PointWindow 扩展 JWindow

我想让 PointWindow 始终位于顶部(绝不在其他 windows 或组件下方)。我在 PointWindow 的构造函数中设置了 setAlwaysOnTop(true) 但问题是当我单击 MainWindow (焦点)时,接下来以不同的方式单击我的桌面(空 space ) 并尝试拖动 PointWindow 然后它在我的 MainWindow.

有什么方法可以让 PointWindow 始终位于所有组件之上?

编辑

在构造函数中我尝试使用 WindowListener 如下

this.addWindowListener(new WindowAdapter() {
    @Override
    public void windowDeactivated(WindowEvent e) {
        toFront();
    }

    @Override
    public void windowLostFocus(WindowEvent e) {
        toFront();
    }
});

...但它不起作用,事件未被捕获

如果两个 windows 属于同一个应用程序,则

setAlwaysOnTop(true);

方法应有尽有,随心所欲

如果您的 window 必须保持在顶部,即使您的应用程序失去焦点,您也必须定期将其推回顶部。如果另一个 window 获得焦点,您无法控制它,但您可以使用线程将您的 window 推回顶部。

在下面的示例中,fr 是您的 window

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 毫秒将您的 window 推回到前面,对于大多数应用程序来说应该足够了。这不是最好的解决方案,但应该可行

编辑:

如果你只是想让 window 在你的另一个 window 前面(重获焦点后的事件),你可以添加和

a FocusListener 到你的 JFrame 并在你的 window 上调用 toFront,当 focusGained(FocusEvent e) 事件触发时。

您可以创建以框架为父级的 JWindow: 新的 JWindow(jframeParent); 这样,您的 JWindow 将收到所有事件。

只是使用未修饰的 JFrame 而不是 JWindow

EDIT2:

如果您只是想让 window 位于顶部,当您单击它时MouseListener 是正确的方法。

解决方案

我将 MouseAdapter 作为 MouseListener 添加到 PointWindow 并且当检测到 mousePressed 事件时执行 toFront() 并且工作正常但是有一个side effect,表示有一个瞬间window是hide and show(非常快)。