Java中嵌套的ActionListeners?

Java中嵌套的ActionListeners?

问题描述:

我正在开发一个应用程序,其中在文本框中输入股票代码符号调用股票价格图的图表。我也想通过选择菜单项以某种方式修改此图表。Java中嵌套的ActionListeners?

用软件来说,如果我可以让菜单项ActionListeners更改状态参数的值,那么最简单的方法就是调用TextField ActionListener重新绘制图表。

当然还有其他方法可以实现这一点,但有没有什么方法可以从另一个actionlistener中调用动作侦听器。编译器不喜欢这个想法。

在此先感谢您的任何见解。

约翰·多纳

+0

你可以发布你的代码示例吗? – 2010-12-17 17:07:38

+1

听起来对我来说是一个令人难以置信的不好主意。 – 2010-12-17 17:08:56

+0

如果你打算说这是一个坏主意,至少应该添加一些文字,以使其正确工作。 – 2010-12-20 17:35:08

您正试图创建一个充当订阅者和发布者的类。简单地让你的类实现ActionListener接口,但也提供了一种方法来订阅你的类中的ActionListeners。

public class MyActionSubPub 
{ 
    private List<ActionListener> downstreams = new ArrayList<ActionListener>(); 
    public MyActionSubPub(AbstractButton(or whatever) button) 
    { 
     button.addActionListener(this); 
    } 
    public addActionListener(ActionListener listener) 
    { 
     downstreams.add(listener); 
    } 
    public void actionPerformed(ActionEvent event) 
    { 
     ... do your stuff ... 
     ... loop through all downstreams, call actionPerformed on each... 
    } 
} 

或者,您可以创建一个发送事件给一个班,等待其返回,然后发送动作到下一类的适配器。

+0

那么,你已经提高了我对Java的知识:这不是我想要的。谢谢。 – 2010-12-17 21:00:40

一种方式做,这将是使你的ActionListeners“瘦”,让他们委托给私有方法的地方,例如:

class Controller { 
    ... // variable declarations etc 

    public Controller() { 
     textField.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { 
      setStockSymbol(...); 
      replot(); 
     }}); 
     menuItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { 
      setStatusParameter(...); 
      replot(); 
     }}); 
    } 

    private void replot() { 
     // Do whatever 
    } 
} 

这个因素了型重构部分来自ActionListeners。如果您需要其他代码路径来触发重绘图,那么现在实现这些路径很简单,而且您的绘图代码现在可以很好地与参数更新代码分开。