Как настроить ключевые прослушиватели для работы в определенной области в JSplitPane, сделанной для JFrame?
В настоящее время у меня есть JFrame, который я разделил на три JSplitPanes (одно деление вертикально вниз по центру, а левая панель этого имеет горизонтальное разделение). У меня есть функциональная игра на левой панели, которая прекрасно работает, когда запускается сама по себе в своем JFrame, но когда она помещена в JSplitPane, слушатели действий на клавишах не работают в игре, но мой пробел работает как нажатие кнопки запуска Кнопка в другой панели.
Ниже я публикую раздел кода, который касается разделенных панелей. У меня вопрос, есть ли способ сделать так, чтобы ключевые слушатели в игре работали? Также есть ли способ заставить слушателя кнопки пуска работать, в то же время поддерживая игру в игре, но переключить функцию активации кнопки, когда вы нажимаете "r" вместо пробела?
(Краткое описание переменных в коде. "Доска" - это фактически новый экземпляр игры, активируемой в другом классе, она раскрашивает игровое поле и начинает игру, когда вы нажимаете кнопку запуска. "GameTable" - это JPanel на левая сторона, в которой находятся кнопка "Пуск" и быстрый заголовок. "Статистика" просто содержит некоторые неинтерактивные элементы, такие как оценки и высокие оценки.)
//Creates a new game and assigns it to the GameTable JPanel
GameTable.add(board, BorderLayout.SOUTH);
/* NOTE:
* The Vertical and Horizontal SplitPanes are flipped.
* The GameTableHorizontal uses the JSplitPane.VERTICAL_SPLIT function but splits horizontally
* The opposite is true for the VerticalSplitPane
* The cause for this is still unknown
*/
//Adds GameTable JPanel and board to GameTableHorizontal SplitPane and adds that to JFrame
GameTableHorizontal = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, GameTable, board);
GameTableHorizontal.setDividerLocation(50);
GameTableHorizontal.setEnabled(false);
this.add(GameTableHorizontal);
//Adds GameTableHorizontal and Statistics JPanels to VerticalSplitPane and adds that to JFrame
VerticalSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, GameTableHorizontal, Statistics);
VerticalSplitPane.setDividerLocation(xPos/2);
VerticalSplitPane.setEnabled(false);
this.add(VerticalSplitPane);
//Creates a start button and assigns an ActionListener to it
Start = new JButton("Start");
StartListener actionStart = new StartListener();
Start.addActionListener(actionStart);
1 ответ
Прежде всего, имена переменных НЕ должны начинаться с символа верхнего регистра. Следуйте соглашениям Java. Неправильные соглашения об именах портят подсветку кода, размещенного на форуме.
есть ли способ сделать так, чтобы ключевые слушатели по игре работали?
Не используйте KeyListeners. Проблема, скорее всего, в том, что ваша игровая панель не имеет фокуса.
Swing был разработан для использования с привязками клавиш. Когда используешь Key Bindings
Вы можете связать KeyStroke
для Action
, Действие все еще может быть вызвано, даже если компоненты не имеют фокуса.
Вы можете найти на форуме множество примеров, используя привязки клавиш. Или вы можете проверить движение с помощью клавиатуры для сравнения кода между двумя подходами. В комплекте с рабочими примерами обоих подходов.