Я написал апплет Java, который использует несколько JPanels. Один для главного меню, один для списка рекордов, один для самой игры и один для финального экрана, который показывает счет и просит пользователя ввести свое имя.
В Mac OS X, как только один JPanel получает фокус (используя MouseListener или с таймером), фокус легко переключается на новые JPanel. В Windows, однако, вам нужно каждый раз нажимать на каждый экран, чтобы вручную вернуть фокус.
У меня вопрос: есть ли элегантное кроссплатформенное решение, позволяющее всегда сохранять фокус в самой верхней 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();
}
}
}