【问题标题】:Java event handlersJava 事件处理程序
【发布时间】:2009-02-19 14:09:26
【问题描述】:

我正在编写一个小型 Java 应用程序(在 Windows 上,因此在我的名字后面附加了 _on_vista)。

我有 3 个按钮,所有这些按钮都会对点击事件做出反应,但会做不同的事情。

以下代码是公认的方式还是我不知道的更清洁的方式? 一方面,它有效,另一方面,似乎有些不对劲......

谢谢

cool_button_1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        coolfunction1();
    }
});

cool_button_2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        coolfunction2();
    }
});

// etc ...

被调用的函数将根据需要产生线程,依此类推。

更新 - 两者都是很好(几乎相同)的答案。我接受了代表较低的那个来分享财富。再次感谢各位。

【问题讨论】:

    标签: java swing event-handling


    【解决方案1】:

    是的,这是正确的方法。这有点笨拙(必须编写五行长代码才能调用方法)但那是 Java :(

    【讨论】:

    • 哈哈,经过大约一年的 php,在 java 中从事这个项目是一种绝对的乐趣!一个真正的语言 api 是我认为理所当然的。
    • 你不会写五行来调用一个方法。当按下按钮时,您编写了五行来调用方法。那是有区别的。
    • 我认为 Aaron 的反对意见是,某些语言只允许您将函数指针传递给 coolfunction1,而不必用新对象包装它。
    • 那他为什么不这么说呢?当人们显然无法表达自己时,为什么我必须不断猜测他们的真正意思? :(
    【解决方案2】:

    这还不错。我更喜欢使用Actions 并从它们创建JButtons

    Action fooAction = new AbstractAction() { ... };
    JButton fooButton = new JButton(fooAction);
    

    【讨论】:

    • 感谢您的意见,如果遇到类似问题,我会记住这一点
    • 是的,您可以重复使用菜单操作并禁用它们。
    【解决方案3】:

    这是正确的方法之一。

    您正在使用匿名侦听器,但有一个替代方法

    http://java.sun.com/docs/books/tutorial/uiswing/events/intro.html上很好地解释了

    你编写一个实现 ActionListener 的类并让它为你处理逻辑

    【讨论】:

      【解决方案4】:

      我会说代码很好,就像 Java 代码一样。这是 Java 经常受到批评的冗长的一个很好的例子 - 在这种情况下,由于缺少闭包。

      【讨论】:

      • 我没有使用闭包,因为我不明白它们,但你的评论开始为我连接一些点,谢谢
      • 基本上,闭包是一个独立的方法(没有类),您可以将其作为参数传递给方法——这正是您的示例所需要的。您使用的匿名类提供相同的功能,只是在非常少的代码周围有很多样板。
      【解决方案5】:

      我倾向于这样做:

      public class ButtonPanel implements ActionListener {
          JButton button1, button2, button3;
          public ButtonPanel() {
              button1 = new JButton(this);
              button2 = new JButton(this);
              button3 = new JButton(this):
              ...
          }
      
          public void ActionPerformed(ActionEvent e) {
              if( e.getSource() == button1 ) action1();
              else if( e.getSouce() == button2  ) action2();
              else if( e.getSource() == button3 ) action3();
          }
      }
      

      【讨论】:

      • 我遇到的一个问题是 actionPerformed 现在是这个类的公共 API 的一部分,即使没有客户端代码可以直接使用它。如果您坚持使用单个 ActionListener,最好创建一个新的私有实例并将其传递给您的控件。
      • 这是一个优先级的问题;干净的 API 还是易于阅读的代码对您的约束集更重要。我认为我的建议大部分时间都不好,但它肯定是另一种有效的做事方式。我有点失望你投了反对票。嗯嗯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 2013-05-30
      • 2015-06-29
      • 2013-12-24
      相关资源
      最近更新 更多