JWindow总是名列前茅

时间:2016-12-22 13:56:26

标签: java swing always-on-top

我使用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();
    }
});

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

2 个答案:

答案 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()并正常工作但有一个副作用,这意味着有一个窗口隐藏和显示(非常快)的时刻。