Переключение JPanels и keyListeners

Я занимаюсь разработкой игры, в которой вы впервые попадаете на главный экран, где нужно выбрать несколько вариантов, например, одиночная игра, двойная игра, кредиты и т. Д.

У меня есть одна большая проблема. Если я нажимаю кнопку в меню, (не JButton) JPanelПереключатель, но keyListener потерян. Keylistener находится в том же классе, что и игровой код, который реализует JPanel, Я перепробовал все, чтобы получить Keylistener работать, но это просто не будет.

Вот как называются вещи: Главный класс -> Меню -> Игра. Я попытался добавить список ключей в основной класс, но он не работает.

Так, JPanel переключение в порядке, но Keylisteners ушли. Я разрабатывал игру раньше с новым JFrames, поэтому, когда я щелкнул меню, был создан новый кадр. Я не вставил здесь код, потому что он слишком длинный (более 2000 строк), и KeyListener работает, но только когда он в новом JFrame, Я установил режим int в классе Menu, нажав кнопку.

В настоящее время это мой переключатель панели:

public void setJPanel() {
     switch (mode) {
        case 1:
            getContentPane().add(s);
            validate();
            break;
        case 2:
            getContentPane().removeAll();
            getContentPane().add(sp);
            validate();
            break;
    }
}

Заранее спасибо за помощь!

3 ответа

Решение

Вместо того, чтобы использовать KeyListener, вы думали или пытались использовать привязки клавиш? KeyListeners требуют, чтобы компонент, который прослушивается, имел фокус, и фокус может быть потерян по многим причинам, особенно при смене представлений (используете ли вы для этого CardLayout?). Привязки клавиш, с другой стороны, можно настроить так, чтобы они реагировали, даже если связанный компонент не имеет фокуса, но когда он удерживается только в пределах окна, которое имеет фокус. Учебник: Использование CardLayout

редактировать
Я вижу, что вы не используете CardLayout, и я предлагаю вам использовать это, так как это может сделать ваше представление более чистым и простым.

Редактировать 2
Я согласен с тем, что вы не хотите публиковать здесь всю свою линейную программу 2000+, так как никто не будет иметь времени для ее прочтения, но подумайте о том, чтобы объединить ваш вопрос / проблему в один небольшой класс, который можно скомпилировать и запустить всем и каждому нам, и демонстрирует вашу проблему. Другими словами, короткий, автономный, компилируемый, пример или SSCCE.

Помните, что код должен быть компилируемым и выполнимым, чтобы многие из нас могли полностью его понять.

Cardlayout на самом деле шустрая при перефокусировке.

@op, попробуйте вызвать requestFocusInWindow() после добавления новой jpanel

Попробуйте использовать myPanel.requsetFocusInWindow();Перед использованием setVisible(true);

Другие вопросы по тегам