Java事件处理程序

Java事件处理程序,java,swing,event-handling,Java,Swing,Event Handling,我正在编写一个小型Java应用程序(在Windows上,因此在我的名字后面附加了_on_vista) 我有3个按钮,它们都会对点击事件做出反应,但会做不同的事情 以下代码是公认的方式还是我不知道的更干净的方式? 一方面,它起作用,另一方面,有些事情似乎不对劲 谢谢 cool_button_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { coolf

我正在编写一个小型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:(

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

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

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

这并不太糟糕。我更喜欢使用并从中创建:

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

还不错。我更喜欢使用它们并从中创建:

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

这是正确的方法之一

您使用的是匿名侦听器,但有一个替代选项

很好地解释了


编写一个实现ActionListener的类,并让它为您处理逻辑,这是正确的方法之一

您使用的是匿名侦听器,但有一个替代选项

很好地解释了


当您编写一个实现ActionListener的类并让它为您处理逻辑时,我倾向于这样做:

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();
    }
}

我倾向于这样做:

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();
    }
}


哈哈,经过大约一年的php学习,用java开发这个项目绝对是一件乐事!一个真正的语言api是我想当然的事情。你不需要写五行代码来调用一个方法。你只需要写五行代码来调用一个按钮。这是一个不同。我想Aaron的反对意见是有些语言会让你这么做你将一个函数指针传递给coolfunction1,而不是用一个新对象来包装它。那么他为什么不这么说呢?为什么当人们显然无法表达自己时,我必须不断猜测他们的真正意思呢(哈哈,经过大约一年的php学习,用java开发这个项目是一件非常愉快的事情!我认为一个真正的语言api是理所当然的事情。你不需要写五行代码来调用一个方法。你只需要写五行代码来调用一个按钮。这是一个区别。我想Aaron的反对意见是,有些语言只会让y你将一个函数指针传递给coolfunction1,而不是用一个新对象来包装它。那么他为什么不这么说呢?为什么我必须在人们显然无法表达自己的时候不断猜测他们真正的意思呢(我没有使用闭包,因为我不理解它们,但你的评论开始让我联想到一些要点,谢谢基本上,闭包是一个独立的方法(没有类)您可以将其作为参数传递给一个方法,这正是您的示例中所需要的。您使用的匿名类提供了相同的功能,只是在非常小的代码周围有很多样板文件。我没有使用闭包,因为我不理解它们,但您的注释开始为我连接一些点,谢谢基本上,闭包是有用的独立方法(没有类)您可以将其作为参数传递给方法-这正是您的示例中所需的。您使用的匿名类提供了相同的功能,只是有大量的样板文件和很少的代码。感谢您的输入,如果遇到类似问题,我会记住这一点。是的,您可以使用菜单重用操作并禁用它们。谢谢对于输入,如果遇到类似的问题,我会记住这一点。是的,您可以将操作与菜单一起重用并禁用它们。我现在遇到的一个问题是actionPerformed现在是此类公共API的一部分,即使没有客户端代码可以直接使用它。如果您坚持使用单个ActionListener,创建创建一个新的私有实例并将其传递给您的控件。这是一个优先级问题;一个干净的API还是易于阅读的代码对您的约束集更为重要。我不认为我的建议在大多数情况下是好的,但它肯定是另一种有效的方法。我对您否决它感到有点失望。啊,我们LH.我现在遇到的一个问题是actionPerformed现在是这个类的公共API的一部分,即使没有客户端代码可以直接使用它。如果你坚持使用单个ActionListener,可能最好创建一个新的私有实例并将其传递给你的控件。这是一个优先级问题;是干净的API还是易于阅读的代码对你的约束更重要。我不认为我的建议在大多数情况下是好的,但它肯定是另一种有效的做事方式。我有点失望你否决了它。好吧。