Java-апплет, поддерживающий фокус с несколькими JPanels - PullRequest
0 голосов
/ 05 декабря 2010

Я написал апплет 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();
        }
    }
}

1 Ответ

0 голосов
/ 06 декабря 2010

Хорошо, я понял это. Я могу использовать Timer, чтобы получить первый JPanel, чтобы получить фокус, а затем, когда я переключаюсь на другую панель, я вызываю transferFocus() в главном меню для нового представления.

...