Как я могу сделать AciveEvent и keyevent Fire одинаковым действием?

StackOverflow https://stackoverflow.com/questions/4289715

Вопрос

Я пишу апплет и хочу выяснить, как сделать кнопку и ключевое событие охватывает один и тот же код кода. За этот вопрос я позвоню эту кнопку fireButton. Отказ Код для события действия, конечно, будет выглядеть так:

public void actionPerformed(ActionEvent e) {
   if (e.getSource() == fireButton) {
      //all the code that pressing button executes
   }  
}

Теперь я хочу нажать клавишу «Enter», чтобы выполнить тот же код, который обрабатывает событие действий, но я не хочу снова переписать весь код в keyPressed метод.

Чтобы быть конкретным, я пишу программу Battleship, и кнопка «Fire» принимает вход с двух текстовых полей, обрабатывает исключения и передает вход в качестве параметров к способу, который пожали на определенном квадрате в сетке. В идеале, нажатие клавиши ввода будет функционировать так же, как будто я нажал кнопку Fire. Есть ли способ сделать определенный метод позвонить actionPerformed Метод? Если нет, то, что было бы элегантным решением проблемы?

Это было полезно?

Решение

  1. Создать действие
  2. Добавьте действие на JButton
  3. Используйте ключевые привязки, чтобы связать ключ ввода к действию

Прочитать Учебник с качелями. Отказ Есть разделы на:

  1. Как использовать действия
  2. Как использовать ключевые привязки

Если вы просто говорите о вызове кнопки «Огонь» с помощью клавиши 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();

Если вы публикуете актуальный код, я могу сделать дальнейшие предложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top