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

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

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

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

Итак, JPanel переключается нормально, а вот Keylistener уже нет. Раньше я разрабатывал игру с новыми JFrame, поэтому, когда я щелкал меню, создавался новый фрейм. Я не стал вставлять код сюда, потому что он слишком длинный (2000+ строк), и KeyListener работает, но только когда он в новом JFrame. Я установил режим in в классе Menu, нажав кнопку.

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

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

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


person Simon Tamás    schedule 18.11.2011    source источник


Ответы (2)


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

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

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

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

person Hovercraft Full Of Eels    schedule 18.11.2011
comment
Благодарю вас! Да, я читал про CardLayout, но он только скрывает панель, а не убирает ее (правильно?), и может привести к падению FPS. Я не могу сделать пример кода, он слишком большой для этого. Вместо этого я просто объясню это. KeyListener — это простой открытый ключ void keyPressed(KeyEvent e) и KeyReleased. Есть два класса, они находятся в JPanels, которые имеют 2 разных KeyListeners. Вы должны добавлять и удалять JPanels в основном классе, который является JFrame. Я думаю, мне просто нужен метод, который добавляет и удаляет KeyListeners. Еще раз спасибо! :) - person Simon Tamás; 19.11.2011
comment
Кроме того, я переписал переключение, чтобы оно стало лучше. Я создал класс запуска для JPanel: pastebin.com/Eyubj06C и добавил метод в основной класс примерно так: pastebin.com/GTiWYEt1 и вызывается при нажатии кнопки следующим образом: main.singlePlay(sc ); где СК = меню. Большое спасибо! - person Simon Tamás; 19.11.2011
comment
@SimonTamás: Извините, я мало что могу вам сказать, основываясь на этих небольших фрагментах кода. - person Hovercraft Full Of Eels; 19.11.2011
comment
Итак, теперь я использую cardLayout, панели jpanels переключаются правильно, но keyListner все еще облажался :(. Итак, например, у меня есть меню и одиночная игра. Они в основном одинаковы. У них обоих есть класс TAdapter, с keyTyped(), keyReleased() и keyPressed(). Они работают при открытии в новом окне, но не в том же окне :(. Спасибо за заранее! - person Simon Tamás; 21.12.2011
comment
@SimonTamás: опять же, как насчет использования привязок клавиш? - person Hovercraft Full Of Eels; 21.12.2011
comment
привязка клавиш? не могли бы вы опубликовать ссылку или фрагмент кода для меня? :) - person Simon Tamás; 21.12.2011

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

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

person Patrick M    schedule 18.11.2011
comment
да, это был и мой опыт работы с CardLayout. К счастью, привязки клавиш могут обойти это. 1+ за полезный ответ. - person Hovercraft Full Of Eels; 18.11.2011
comment
Я его добавил, но ничего не делает :( JPanels переключаются, а KeyListener нет :( - person Simon Tamás; 19.11.2011