Как я могу сделать AciveEvent и keyevent Fire одинаковым действием?
-
28-09-2019 - |
Вопрос
Я пишу апплет и хочу выяснить, как сделать кнопку и ключевое событие охватывает один и тот же код кода. За этот вопрос я позвоню эту кнопку fireButton
. Отказ Код для события действия, конечно, будет выглядеть так:
public void actionPerformed(ActionEvent e) {
if (e.getSource() == fireButton) {
//all the code that pressing button executes
}
}
Теперь я хочу нажать клавишу «Enter», чтобы выполнить тот же код, который обрабатывает событие действий, но я не хочу снова переписать весь код в keyPressed
метод.
Чтобы быть конкретным, я пишу программу Battleship, и кнопка «Fire» принимает вход с двух текстовых полей, обрабатывает исключения и передает вход в качестве параметров к способу, который пожали на определенном квадрате в сетке. В идеале, нажатие клавиши ввода будет функционировать так же, как будто я нажал кнопку Fire. Есть ли способ сделать определенный метод позвонить actionPerformed
Метод? Если нет, то, что было бы элегантным решением проблемы?
Решение
- Создать действие
- Добавьте действие на JButton
- Используйте ключевые привязки, чтобы связать ключ ввода к действию
Прочитать Учебник с качелями. Отказ Есть разделы на:
- Как использовать действия
- Как использовать ключевые привязки
Если вы просто говорите о вызове кнопки «Огонь» с помощью клавиши Enter, затем проверьте Введите ключ и кнопку для пары подходов.
Другие советы
Я предлагаю вам поставить весь код в отдельный метод, который получает все соответствующие данные из события (если есть) в качестве параметров:
public void actionPerformed(ActionEvent e) {
if (e.getSource() == fireButton) {
Object relevantData0 = new Object(); // e.getSomething();
Object relevantData1 = new Object(); // e.getSomethingElse();
handleFireAction(relevantData1, relevantData2);
}
}
public void actionPerformed(KeyEvent e) {
if (e.getSource() == fireButton) {
Object relevantData0 = new Object(); // e.getSomething();
Object relevantData1 = new Object(); // e.getSomethingElse();
handleFireAction(relevantData1, relevantData2);
}
}
private void handleFireAction(Object relevantData0, Object relevantData1) { // Object relevantDat2, and so on
//all the code that pressing button executes
}
Если вам не нужны данные из события, его еще проще;) Таким образом, вы просто пишите свой код один раз для обоих событий. Это общий оо
Надеюсь это поможет.
Заимствование от MVC. Я бы порекомендовал у вас есть класс контроллера, который обрабатывает эти виды запросов. Тогда все, что вам нужно сделать, это делегировать контроллеру в каждом обработчике событий.
Вот так:
public class BattleShipController {
public void handleFireAction() {
// ...
}
}
//-- in your UI class(es)
private BattleShipController _controller = new BattleShipController();
//-- in event calls:
_controller.handleFireAction();
Если вы публикуете актуальный код, я могу сделать дальнейшие предложения.