如何聚焦JFrame?

时间:2009-03-13 01:36:28

标签: java user-interface swing jframe

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

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

有没有办法让这项工作? 提前致谢, 约翰穆拉诺

6 个答案:

答案 0 :(得分:8)

切换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放在Windows的窗口之上   本机应用程序,或Windows的   其他虚拟机。

     

在Windows操作系统上,例如toFront   导致任务栏上的图标   闪烁,但窗口停留在   回来。

     

唯一会认为会强迫的   窗口到前面是setAlwaysOnTop。

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

答案 1 :(得分:8)

调用requestFocus()方法。

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

为了让您获得更大的成功机会,我还建议您在请求关注之前调用toFront()方法。

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

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

答案 2 :(得分:3)

我将采取的方式是:

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

并且如果您还希望对其进行更多控制,则应使用requestFocuse。

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

答案 3 :(得分:3)

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

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

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

我的猜测是目前它们是:

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

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

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

尝试上述..