我正在编写一个小游戏,一个 JFrame 保存主游戏,另一个 JFrame 显示分数。问题是,当我完成构建它们时,JFrame 的分数总是会集中!我试过调用 scoreDisplay.toFront()、scoreDisplay.requestFocus(),甚至:
display.setState(JFrame.ICONIZED);
display.setState(JFrame.NORMAL);
有什么办法可以使这项工作?在此先感谢,约翰·穆拉诺
我正在编写一个小游戏,一个 JFrame 保存主游戏,另一个 JFrame 显示分数。问题是,当我完成构建它们时,JFrame 的分数总是会集中!我试过调用 scoreDisplay.toFront()、scoreDisplay.requestFocus(),甚至:
display.setState(JFrame.ICONIZED);
display.setState(JFrame.NORMAL);
有什么办法可以使这项工作?在此先感谢,约翰·穆拉诺
调用requestFocus()
方法。
这不能保证有效,因为操作系统不允许框架具有焦点的原因有很多。在不同的应用程序中可能有另一个具有更高优先级的帧。还有一些 linux 桌面(如果我没记错的话)不允许框架请求焦点。
为了给你更好的成功机会,我还建议toFront()
在请求焦点之前调用该方法。
frame.setVisible(true);
frame.toFront();
frame.requestFocus();
请记住,这些都不能保证,因为帧处理,尤其是焦点和分层,非常依赖于操作系统。所以将框架设置为可见,将其移动到前面,并请求焦点。一旦你放弃了 EDT,操作系统很可能会把焦点放在框架上。至少,窗口应该在顶部。
切换alwaysOnTop
看这里:
http://forums.sun.com/thread.jspa?threadID=5124278
阅读 API http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#toFront中的 toFront
某些平台可能不允许此 VM 将其 Windows 放置在本机应用程序的窗口或其他 VM 的 Windows 之上。
在 Windows 操作系统上,例如 toFront 会导致任务栏上的图标闪烁,但窗口停留在后面。
唯一会迫使窗口靠前的是setAlwaysOnTop。
frame.setAlwaysOnTop(true);
frame.setAlwaysOnTop(false);
我会做的方式是:
frame.toFront();
frame.setState(Frame.NORMAL);
如果您还想对其进行更多控制,则应使用 requestFocuse。
顺便说一句,这是一个例子: http ://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2006-06/msg00152.html
有没有考虑把分数设置在和游戏帧相同的帧里?
其他可能的(快速和肮脏的)选项是以相反的顺序创建它们,或者至少(如果分数取决于游戏)以相反的顺序显示它们。
score.setVisible( true );
game.setVisible( true );
我的猜测是,目前它们是:
game.setVisible( true );
score.setVisible( true );
只需在 JOptionPaneMessageDialog 代码上方添加以下代码行... this.setAlwaysOnTop(false);
frame.setExtendedState( JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
试试上面的..