Как заставить ActionEvent и KeyEvent запустить одно и то же действие? - PullRequest
1 голос
/ 27 ноября 2010

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

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

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

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

Ответы [ 3 ]

1 голос
/ 27 ноября 2010

Я предлагаю вам поместить весь код в отдельный метод, который получает все соответствующие данные из события (если есть) в качестве параметров:

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
}  

Если вам не нужны какие-либо данные о событии, это еще проще;) Таким образом, вы просто пишете свой код один раз для обоих событий. Это общий ОО подход.
Надеюсь, это поможет.

1 голос
/ 27 ноября 2010
  1. Создание действия
  2. Добавление действия к кнопке J
  3. Использование привязок клавиш для привязки клавиши ввода к действию

Чтение Учебник по Swing .Есть разделы:

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

Если вы только что говорили о вызове кнопки «Огонь»с помощью клавиши ввода, затем проверьте клавишу ввода и кнопку для пары подходов.

0 голосов
/ 27 ноября 2010

Заимствование из MVC Я бы порекомендовал вам иметь класс контроллера, который обрабатывает такие запросы.Затем все, что вам нужно сделать, это делегировать контроллер в каждом обработчике событий.

Примерно так:

public class BattleShipController {

   public void handleFireAction() {
   // ...
   }
}

//-- in your UI class(es)
private BattleShipController _controller = new BattleShipController();

//-- in event calls:
_controller.handleFireAction();

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

...