如何关注JFrame?

我正在写一个小游戏,一个JFrame包含主游戏,另一个JFrame显示得分。 问题是,当我完成构建它们时,得分JFrame总是最终集中注意力! 我试过调用scoreDisplay.toFront(),scoreDisplay.requestFocus(),甚至:

display.setState(JFrame.ICONIZED); display.setState(JFrame.NORMAL); 

有没有办法让这项工作? 在此先感谢,约翰穆拉诺

您是否考虑将得分设置在与游戏框架相同的框架中?

其他可能的(快速和脏)选项是以相反的顺序创建它们,或者至少(如果得分取决于游戏)以相反的顺序显示它们。

 score.setVisible( true ); game.setVisible( true ); 

我猜他们目前是:

 game.setVisible( true ); score.setVisible( true ); 

切换alwaysOnTop

看这里:

http://forums.sun.com/thread.jspa?threadID=5124278

阅读API中的toFront http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#toFront

某些平台可能不允许此VM将其Windows置于本机应用程序的窗口或其他VM的Windows之上。

在Windows操作系统上,例如toFront导致任务栏上的图标闪烁,但窗口保持在后面。

唯一会强制窗口向前的想法是setAlwaysOnTop。

 frame.setAlwaysOnTop(true); frame.setAlwaysOnTop(false); 

调用requestFocus()方法。

这不能保证有效,因为操作系统不允许帧具有焦点的原因有很多。 在不同的应用程序中可能存在具有更高优先级的另一帧。 还有一些Linux桌面(如果我没记错的话)不允许帧请求焦点。

为了给你更好的成功机会,我还建议在请求焦点之前调用toFront()方法。

 frame.setVisible(true); frame.toFront(); frame.requestFocus(); 

请记住,这一切都不能保证,因为帧处理,尤其是焦点和分层,是非常依赖于操作系统的。 因此,将框架设置为可见,将其移至前方,并请求焦点。 一旦放弃EDT,操作系统可能会使框架成为焦点。 至少,窗口应该在顶部。

我会这样做的方式是:

  frame.toFront(); frame.setState(Frame.NORMAL); 

如果你还想对它有更多的控制权,你应该使用requestFocuse。

BTW,这是一个例子: http : //coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2006-06/msg00152.html

只需在JOptionPaneMessageDialog代码上添加以下代码行… this.setAlwaysOnTop(false);

 frame.setExtendedState( JFrame.MAXIMIZED_BOTH); frame.setVisible(true); 

试试以上..