Переключение JPanels и keyListeners - PullRequest
1 голос
/ 18 ноября 2011

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

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

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

Итак, переключение JPanel в порядке, но Keylistener прошло.Раньше я разрабатывал игру с новыми JFrame s, поэтому, когда я щелкал меню, был создан новый фрейм.Я не вставил сюда код, потому что он слишком длинный (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;
    }
}

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

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

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

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

2 голосов
/ 18 ноября 2011

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

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

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

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

...