我正在开发一个应用程序,其中在文本字段中输入股票代码符号来调用股票价格图表。我还想通过选择菜单项以某种方式修改此图表。
在软件方面,如果我可以让菜单项ActionListeners更改status参数的值,那么最简单的方法就是调用TextField ActionListener来重新绘制图表。
当然有其他方法可以实现这一点,但有没有办法从另一个actionlistener中调用一个动作监听器。编译器不喜欢这个想法。
提前感谢任何见解。
John Doner
答案 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...
}
}
或者,您可以创建一个适配器,将事件发送到一个类,等待它返回,然后将操作发送到下一个类。