显然,这个问题已经存在here。和over here有人回答类似。但是,我尝试了两种方法(正如我指出的那样),而且都不适合我。我在Windows 10上使用Java 8 Update 22,而最后一篇文章中的海报不在Windows和Java 7上,所以也许这些东西中的一个与它有关。代码我都试过了,其中getInstance()
是我的JFrame对象:我做不将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);
}
注希望窗口总是留在上面。但是,最后一段代码保持最佳状态。
编辑:我现在意识到它并不总是留在上面。问题是,窗口首先出现在顶部,但没有焦点(任务栏中的图标闪烁),这意味着如果用户单击窗口以外的其他位置,窗口将保持顶部,因为它不是没有“失去焦点”,因为它没有任何开始。我试过requestFocus()
,但那也没用。可能是因为this explanation。我怎样才能确保窗口专注于最初的弹出窗口?
我试过mKorbel的解决方案,但那也不管用。它只在窗口已经出现并且已被激活时才起作用,并且被禁用,并且当调用该方法时,该窗口出现在前面。但是,当第一个初始化窗口时,它不显示在前面。
private static void bringToFront() {
getInstance().setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
getInstance().toFront();
}
});
getInstance().requestFocus();
getInstance().repaint();
}
再次的JFrame忽略toFront(基于从本机OS对等体)本的funcionality从的JDialog /的JWindow(与模态和alwaysInTop等),getExtendedState()&〜JFrame.ICONIFIED&JFrame的保留。正常;适用于JFrame的单个实例,然后将此容器移动到屏幕的前端(例如,通过Chrome浏览器...) – mKorbel
[您可以测试](http://stackoverflow.com/a/6139696/714968),适用于我从WinXP到Win10,包括。服务器版本(2008/2012)与GUI – mKorbel
@mKorbel我真的很感激你试图向我解释这个,但我真的不明白你在说什么。从你链接到的例子我只知道你在JFrame上使用它(这对我不起作用;我不能使用iconified - > normal,请参阅我的链接问题): 'frame.setExtendedState(Frame.ICONIFIED) ; frame.setExtendedState(Frame.NORMAL); frame.setAlwaysOnTop(true); frame.setAlwaysOnTop(false);' –