gpt4 book ai didi

java - JWindow 始终位于顶部

转载 作者:行者123 更新时间:2023-12-01 09:05:57 26 4
gpt4 key购买 nike

我使用了 Java 和 Swing。

我有两个窗口 MainWindowPointWindow

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

此代码将每隔 100 毫秒将窗口推回到前面,这对于大多数应用程序来说应该足够了。这不是最好的解决方案,但应该可行

编辑:

如果您只想让窗口位于其他窗口的前面(焦点重新获得后的事件),您可以添加 和

一个FocusListener当 focusGained(FocusEvent e) 事件触发时,添加到您的 JFrame 并在窗口上调用 toFront。

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

或者仅使用未修饰的 JFrame 而不是 JWindow

编辑2:

如果您只想让窗口位于顶部,则单击它时,会出现 MouseListener是正确的做法。

关于java - JWindow 始终位于顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41284816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com