Переключение JPanels и keyListeners
Я занимаюсь разработкой игры, в которой вы впервые попадаете на главный экран, где нужно выбрать несколько вариантов, например, одиночная игра, двойная игра, кредиты и т. Д.
У меня есть одна большая проблема. Если я нажимаю кнопку в меню, (не JButton
) JPanel
Переключатель, но keyListener потерян. Keylistener
находится в том же классе, что и игровой код, который реализует JPanel
, Я перепробовал все, чтобы получить Keylistener
работать, но это просто не будет.
Вот как называются вещи: Главный класс -> Меню -> Игра. Я попытался добавить список ключей в основной класс, но он не работает.
Так, JPanel
переключение в порядке, но Keylistener
s ушли. Я разрабатывал игру раньше с новым 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;
}
}
Заранее спасибо за помощь!
3 ответа
Вместо того, чтобы использовать KeyListener, вы думали или пытались использовать привязки клавиш? KeyListeners требуют, чтобы компонент, который прослушивается, имел фокус, и фокус может быть потерян по многим причинам, особенно при смене представлений (используете ли вы для этого CardLayout?). Привязки клавиш, с другой стороны, можно настроить так, чтобы они реагировали, даже если связанный компонент не имеет фокуса, но когда он удерживается только в пределах окна, которое имеет фокус. Учебник: Использование CardLayout
редактировать
Я вижу, что вы не используете CardLayout, и я предлагаю вам использовать это, так как это может сделать ваше представление более чистым и простым.
Редактировать 2
Я согласен с тем, что вы не хотите публиковать здесь всю свою линейную программу 2000+, так как никто не будет иметь времени для ее прочтения, но подумайте о том, чтобы объединить ваш вопрос / проблему в один небольшой класс, который можно скомпилировать и запустить всем и каждому нам, и демонстрирует вашу проблему. Другими словами, короткий, автономный, компилируемый, пример или SSCCE.
Помните, что код должен быть компилируемым и выполнимым, чтобы многие из нас могли полностью его понять.
Cardlayout на самом деле шустрая при перефокусировке.
@op, попробуйте вызвать requestFocusInWindow() после добавления новой jpanel
Попробуйте использовать
myPanel.requsetFocusInWindow();
Перед использованием
setVisible(true);