Java中的“嵌套”ActionListeners?

时间:2010-12-17 17:03:18

标签: java swing actionlistener

我正在开发一个应用程序,其中在文本字段中输入股票代码符号来调用股票价格图表。我还想通过选择菜单项以某种方式修改此图表。

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

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

提前感谢任何见解。

John Doner

2 个答案:

答案 0 :(得分:2)

这样做的一种方法是让你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的重新绘制部分。如果您需要其他代码路径来触发重新绘制,那么现在可以很容易地实现这些路径,并且您的绘图代码现在可以很好地与参数更新代码分开。

答案 1 :(得分:1)

您正在尝试创建一个既充当订阅者又充当发布者的类。只需让您的类实现ActionListener接口,但也提供了一种在类中订阅ActionListener的方法。

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...
    }
}

或者,您可以创建一个适配器,将事件发送到一个类,等待它返回,然后将操作发送到下一个类。