问题描述
我有一个GUI元素,用于swing应用程序中的几个不同点。 按下“确定”按钮后,我需要在每个实例中运行不同的代码。
我通过在每种情况下传递一个动作监听器来解决这个问题,但是当我继续这样做时会变得混乱。 最好将块传递给Ruby中的方法。 我想知道Java中是否存在类似但干净的东西。
凌乱的代码:主要是由于需要在GUI对象的元素上调用方法。 如果我在构造函数中传递ActionListener,则该对象尚不存在。 我可以在每个实例中调用第二种方法,但这不是优选的。
1楼
你已经有了正确的想法。 将任意代码块传递给方法的常用解决方案是 。 如果您可以显示现在的“杂乱”代码示例,则可以帮助您清理它。
更新Re:凌乱的代码
如果我在构造函数中传递ActionListener,则该对象尚不存在。
实际的代码示例将有助于提供良好的响应。 猜测一下,我想也许你想看看 ? 在这种情况下,我更多地考虑封装的好处而不是多态的好处。 再一次,只是猜测。 看代码有帮助。
2楼
传递ActionListener
实现可能是您现在可以做的最好的。
Java 8将提供对“闭包”的支持,这将通过单个单参数方法极大地简化接口的实现。 但是,由于Java 7几乎不会出现,Java 8将需要几年时间。
3楼
Java不支持将代码块(或函数)作为一等公民的想法。 这就是为什么事件是通过实现特定接口的类完成的。 你似乎已经做了类似的事情,所以也许你只需要创建自己的界面来支持你想要支持的特定事件。
4楼
我所采用的解决方案并没有真正正确地解决问题的标题,而是完全符合我的需求。 因为:
- 在我的情况下,它始终是被解析的相同功能(即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();
}
});