1

我正在编写一个小程序,并想弄清楚如何使按钮和键事件覆盖相同的代码位。对于这个问题,我将调用此按钮fireButton。动作事件的代码当然是这样的:

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

现在,我想按“回车”键来执行动作事件处理的相同代码,但我不想在keyPressed方法中再次重写所有代码。

具体来说,我正在编写一个战舰程序,“开火”按钮从两个文本字段中获取输入,处理异常,并将输入作为参数传递给在网格中特定方格上开火的方法。理想情况下,按下回车键的功能与按下开火按钮的方式相同。有没有办法让某个方法调用一个actionPerformed方法?如果不是,那么解决问题的优雅方法是什么?

4

3 回答 3

1
  1. 创建一个动作
  2. 将动作添加到 JButton
  3. 使用 Key Bindings 将 Enter 键绑定到 Action

阅读Swing 教程。有以下部分:

  1. 如何使用动作
  2. 如何使用键绑定

如果您只是在谈论使用 Enter 键调用“Fire”按钮,那么请查看Enter Key 和 Button以了解几种方法。

于 2010-11-27T04:26:35.900 回答
1

我建议您将所有代码放在一个单独的方法中,该方法接收来自事件的所有相关数据(如果有)作为参数:

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
}  

如果您不需要事件中的任何数据,则更容易;)这样,您只需为两个事件编写一次代码。这是一种通用的 OO 方法。
希望这可以帮助。

于 2010-11-27T04:14:07.733 回答
0

借用MVC,我建议你有一个控制器类来处理这些类型的请求。然后您所要做的就是委托给每个事件处理程序中的控制器。

像这样:

public class BattleShipController {

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

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

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

如果您发布相关代码,我可以提出进一步的建议。

于 2010-11-27T02:09:12.047 回答