0
我编写了一个使用多个JPanel的Java小应用程序。一个用于主菜单,一个用于高分列表,一个用于游戏本身,另一个用于最终结束屏幕,用于显示分数并要求用户输入他/她的名字。用多个JPanel保持焦点的Java小应用程序
在Mac OS X上,一旦一个JPanel获得焦点(使用MouseListener或Timer),焦点就可以轻松切换到新的JPanel。但是,在Windows上,您必须单击每个屏幕才能手动重新获得焦点。
我的问题是,是否有一个优雅的跨平台解决方案,始终将焦点放在Applet的最顶级JPanel中,即使顶级JPanel发生了变化?
这里是我做的到JPanels之间切换什么的示例代码:
public void showMainMenu() {
if (endScreen != null) {
endScreen.stop();
getContentPane().remove(endScreen);
endScreen = null;
}
if (highScoreView != null) {
getContentPane().remove(highScoreView);
highScoreView = null;
}
if (gameView != null) {
gameView.stop();
getContentPane().remove(gameView);
gameView = null;
}
if (mainMenu == null) {
mainMenu = new MainMenu(d, this);
}
getContentPane().add(mainMenu);
forceRequestFocus();
validate();
repaint();
}
我用一种变通方法,我发现在这里使用非重复的计时器来获取JPanel的焦点尝试,所以用户不必点击它。唯一的问题是,它只能使用一次。新的JPanel替换另一个后,焦点将丢失,只能通过单击鼠标来恢复。
private void forceRequestFocus() {
Timer focusTimer = new Timer(5, new RequestFocusActionListener());
focusTimer.setRepeats(false);
focusTimer.start();
}
private class RequestFocusActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (highScoreView != null) {
highScoreView.requestFocusInWindow();
}
else if (mainMenu != null) {
mainMenu.requestFocusInWindow();
}
else if (gameView != null) {
gameView.requestFocusInWindow();
}
else if (endScreen != null) {
endScreen.requestFocusInWindow();
}
}
}