Java单个ActionListener和总体ActionListener

Java单个ActionListener和总体ActionListener,java,swing,awt,jbutton,actionlistener,Java,Swing,Awt,Jbutton,Actionlistener,也许我走错了方向。让我知道 使用Swing和AWT,我在一个框架上设置了几个按钮,每个按钮都有一个对应于其特定功能的ActionListener,即 JButton foo_button = new JButton("Foo-Me"); foo_button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { //Fancy schmancy cod

也许我走错了方向。让我知道 使用Swing和AWT,我在一个框架上设置了几个按钮,每个按钮都有一个对应于其特定功能的ActionListener,即

JButton foo_button = new JButton("Foo-Me");
foo_button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    } 
})
JButton bar_button = new JButton("Bar None");
bar_button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    } 
})
所以每个按钮都有自己的功能。但是,如果我想让所有按钮都做某件事(每个按钮都有相同的方法),在我的例子中,在它们做自己的事情之前清除一个标签,该怎么办

显然,我可以在每个actionPerformed()中添加任何标签.setText(“”),但这需要大量的重复,我不太喜欢这一点


噢,Java和Swing大师们来帮我。

您可以将自己的
ActionListener实现子类化:

private static abstract class MyListener implements ActionListener {

    @Override
    final public void actionPerformed(ActionEvent evt) {
        theSameTask();
        uniqueTask(evt);
    } 
    private void theSameTask() {
        // the identical task
    }
    public abstract void uniqueTask(ActionEvent evt);
}
然后,新的侦听器将如下所示:

JButton bar_button = new JButton("Bar None");
bar_button.addActionListener(new MyListener() {
    @Override public void uniqueTask(ActionEvent evt) {
        //Fancy schmancy code work
    } 
});

您可以将自己的
ActionListener实现子类化:

private static abstract class MyListener implements ActionListener {

    @Override
    final public void actionPerformed(ActionEvent evt) {
        theSameTask();
        uniqueTask(evt);
    } 
    private void theSameTask() {
        // the identical task
    }
    public abstract void uniqueTask(ActionEvent evt);
}
然后,新的侦听器将如下所示:

JButton bar_button = new JButton("Bar None");
bar_button.addActionListener(new MyListener() {
    @Override public void uniqueTask(ActionEvent evt) {
        //Fancy schmancy code work
    } 
});

另一种可能是使用,并为常见行为编写一个
ActionListener
decorator。然后,您的代码将是

bar_button.addActionListener(new MyActionListenerDecorator( new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    }  }) );

另一种可能是使用,并为常见行为编写一个
ActionListener
decorator。然后,您的代码将是

bar_button.addActionListener(new MyActionListenerDecorator( new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    }  }) );


我认为最好的方法是使用。这样所有的听众都会做同样的事情。

我认为最好的方法是使用。这样所有的听众都会做同样的事情。

+1。不过,不需要将私有方法设为final:它是隐式final。我可以将它放在我正在处理的同一个文件中吗。这是给学校的,上帝禁止好的编码应用。(我们只能提交一个文件)。刚才回答了我自己的问题。我明天一定要试试这个。如果您只可以提交一个文件,则您可以通过添加//花哨的schmancy代码工作获得加分。。。只需提交结果jar文件,其中包含实际需要的任意多个类:-)。愚蠢的规则只要求创造性的变通方法+1。不过,不需要将私有方法设为final:它是隐式final。我可以将它放在我正在处理的同一个文件中吗。这是给学校的,上帝禁止好的编码应用。(我们只能提交一个文件)。刚才回答了我自己的问题。我明天一定要试试这个。如果您只可以提交一个文件,则您可以通过添加//花哨的schmancy代码工作获得加分。。。只需提交结果jar文件,其中包含实际需要的任意多个类:-)。愚蠢的规则只是要求创造性的解决办法1234代表,你确定要回答问题吗P@JacobRaihle写了1234 rep,你确定要回答问题吗?
,我写了--->确保他想要,他可以,他的答案实际上是正确的,涵盖了最有效的方法,从这里的答案来看,一切都取决于你对Java的知识,Swing及其实现方法API@mKorbel我一点也没有冒犯的意思,只是说这是一个很好的数字:)@@Jacob Raihle和我会独家使用ActionListener,当然ActionListener是普通的、简单的和simple@Jacob我杀了他的好数字订单:-):-):-):-):-):-):-)1234代表,您确定要回答问题吗?:P@JacobRaihle写了1234 rep,你确定要回答问题吗?
,我写了--->确保他想要,他可以,他的答案实际上是正确的,涵盖了最有效的方法,从这里的答案来看,一切都取决于你对Java的知识,Swing及其实现方法API@mKorbel我一点也没有冒犯的意思,只是说这是一个很好的数字:)@@Jacob Raihle和我会独家使用ActionListener,当然ActionListener是普通的、简单的和simple@Jacob我杀了他漂亮的数字顺序:-):-):-):-):-):-)我也可以试试这个。我以前读过这方面的书(谢谢你,头一本书)。很好地使用了一个很好的模式。我也可以试试这个。我以前读过这方面的书(谢谢你,头一本书)。很好地使用了一个很好的模式。