【发布时间】:2016-01-06 16:09:42
【问题描述】:
显然,这个问题已经存在here。而over here 也有人回答了类似的问题。但是,我尝试了这两种方法(正如我所指出的),但似乎都不适合我。我在 Windows 10 上使用 Java 8 Update 22,而最后一篇文章的海报不在 Windows 和 Java 7 上,所以也许其中一件事情与它有关。我试过的代码,getInstance() 是我的 JFrame 对象:
private static void bringToFront() {
getInstance().setVisible(true);
getInstance().setExtendedState(JFrame.NORMAL);
getInstance().toFront();
getInstance().repaint();
}
private static void bringToFront() {
getInstance().setVisible(true);
getInstance().toFront();
getInstance().requestFocus();
getInstance().repaint();
}
@Override
public void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
请注意,我确实不希望窗口始终保持在顶部。但是,使用最后一个 sn-p 它确实保持在顶部。
编辑:我现在意识到它并不总是保持领先。问题是它的窗口最初出现在顶部,但没有焦点(任务栏中的图标闪烁),这意味着如果用户单击窗口以外的其他位置,窗口将保持在顶部,因为它不是不要“失去焦点”,因为它没有任何开始。我试过requestFocus(),但也没有用。可能是因为this explanation。如何确保窗口聚焦于初始弹出窗口?
我尝试了 mKorbel 的解决方案,但也没有用。它仅在窗口已经出现并被激活和取消激活并且当 then 方法被调用时,窗口来到前面时才起作用。但是,当第一次初始化窗口时,它不会显示在前面。
private static void bringToFront() {
getInstance().setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
getInstance().toFront();
}
});
getInstance().requestFocus();
getInstance().repaint();
}
【问题讨论】:
-
再次 JFrame 忽略 toFront(基于来自 Native OS 的对等体)此功能保留自 JDialog/JWindow(具有模态和 alwaysInTop 等)、getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;适用于 JFrame 的单个实例,然后将此容器移动到屏幕的前面(向前,例如 Chrome ...)
-
you can to test,适用于我从 WinXP 到 Win10,包括。带有 GUI 的服务器版本 (2008/2012)
-
@mKorbel 非常感谢您试图向我解释这一点,但我真的不明白您在说什么。从您链接到的示例中,我只知道您在 JFrame 上使用它(这对我不起作用;我不能使用图标化 -> 正常,请参阅我的链接问题):
frame.setExtendedState(Frame.ICONIFIED); frame.setExtendedState(Frame.NORMAL); frame.setAlwaysOnTop(true); frame.setAlwaysOnTop(false); -
Focus是异步的,必须包裹在invokeLater中,不会在屏幕上闪烁,通过定时器偶尔闪烁
-
@mKorbel 查看我的编辑。我按照您的建议尝试了,但这也不起作用。如果这不是您的意思,请使用您认为可行的代码添加答案。谢谢。