如何聚焦JFrame?

Joh*_*ano 11 java user-interface swing jframe

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

display.setState(JFrame.ICONIZED);
display.setState(JFrame.NORMAL);
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*son 11

调用requestFocus()方法.

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

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

frame.setVisible(true);
frame.toFront();
frame.requestFocus();
Run Code Online (Sandbox Code Playgroud)

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


ord*_*rig 10

切换 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);
Run Code Online (Sandbox Code Playgroud)


Osc*_*Ryz 4

有没有考虑过将分数设置在与游戏帧相同的帧内?

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

score.setVisible( true );
game.setVisible( true );
Run Code Online (Sandbox Code Playgroud)

我的猜测是,目前他们是:

game.setVisible( true );
score.setVisible( true );
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个解决方案确实解决了OP的问题,但它没有回答标题问题。 (4认同)