2011-03-29 86 views
4

我有一个在swing应用程序中的几个不同点上使用的GUI元素。当按下“确定”按钮时,我需要在每个实例中运行不同的代码。将块传递给Java中的方法

我已经通过在每种情况下传递一个动作侦听器来解决这个问题,但是随着我继续这变得混乱。在Ruby中尽可能将块传递给方法。我想知道Java中是否存在类似但干净的东西。

凌乱代码: 主要是由于需要调用GUI对象元素的方法。如果我在构造函数中传递ActionListener,则该对象尚不存在。我可以在每种情况下调用第二种方法,但不是优选的。

回答

0

我已经使用的解决方案并没有真正解决问题的标题,但完全满足了我的需求。因为:

  • 在我的情况下,它总是被解析的功能(即,onConfirm功能),并且这个功能在每个实例中都是必需的。
  • 每个需要独特功能的实例都不适合工厂模式。

我已经作出了GUI元素摘要:

abstract class Element extends JPanel { 

    ... 
    private final JButton button = new JButton("OK"); 

    protected abstract void onConfirm(); 

    public Element(){ 
     this.button.addActionListener(new ActionListener(){ 
      @Override public void actionPerformed(ActionEvent e) { 
       onConfirm(); 
      } 
     }); 
     ... 
    } 
} 

与几个匿名内部类实现每个让我访问GUI元素的内部。

this.getContentPane().add(new Element(){ 
    @Override public void onConfirm() { 
     doStuffWithCommand(); 
    } 
}); 
3

您有正确的想法。将任意代码块传递给方法的通常解决方案是Command pattern。如果您可以显示您现在具有的“杂乱”代码示例,则可以帮助您清理它。

更新回复:乱码

如果我通过了ActionListener的构造函数中的对象还不存在。

一个实际的代码示例将有助于提供良好的响应。有人猜测,我想说,也许你想看看Factory pattern?在这种情况下,我更多地考虑封装优势,而不是多态优势。再次,只是猜测。看到代码有帮助。

0

Java不支持作为一流公民的代码块(或功能)的想法。这就是事件通过实现特定接口的类来完成的原因。你似乎已经做了类似的事情,所以也许你只需要创建自己的接口来支持你想要支持的特定事件。

1

通过ActionListener实现可能是您现在可以做的最好的。

Java 8将提供对“闭包”的支持,这将大大简化使用单个单参数方法实现接口的过程。但是,对于Java 7几乎没有出现,对于Java 8来说这将是几年。

+0

我不怀疑你是正确的估计,但最后我听说他们还在2012年底拍摄的Java 8。官方估计是否改变了? – 2011-03-29 18:10:23

+0

@Mark Peters - 不,我认为这仍然是官方估计。 – erickson 2011-03-29 18:40:12