【问题标题】:How do I make an ActionEvent and a KeyEvent fire the same action?如何使 ActionEvent 和 KeyEvent 触发相同的操作?
【发布时间】:2010-11-27 02:00:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java event-handling applet keyevent


    【解决方案1】:
    1. 创建动作
    2. 将动作添加到 JButton
    3. 使用键绑定将 Enter 键绑定到操作

    阅读Swing tutorial。有以下部分:

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

    如果您只是在谈论使用回车键调用“开火”按钮,请查看Enter Key and Button 了解几种方法。

    【讨论】:

      【解决方案2】:

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

      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 方法。
      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

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

        像这样:

        public class BattleShipController {
        
           public void handleFireAction() {
           // ...
           }
        }
        
        //-- in your UI class(es)
        private BattleShipController _controller = new BattleShipController();
        
        //-- in event calls:
        _controller.handleFireAction();
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-13
          • 1970-01-01
          • 2016-05-18
          • 2020-05-10
          • 1970-01-01
          相关资源
          最近更新 更多