将变量传递给Java ActionListener?

时间:2010-11-18 05:01:10

标签: java applet actionlistener

我有没有办法将变量传递给actionlistener而不将其称为final?我想在某种定时方式中使用这两点...我尝试了Thread.sleep()但由于某种原因它与程序的其余部分不能很好地融合。这是我真正想要使用的格式,但我知道它可能无法实现。 我愿意接受任何建议。谢谢!

(如果这是一个愚蠢的问题,我很抱歉,我找到了答案,但似乎找不到答案。)

public void timedMain(Point current, Point wanted){
          ActionListener taskPerformer = new ActionListener(){
              public void actionPerformed(ActionEvent evt){
                  System.out.println(wanted+" "+current);}};
                  actiontimer = new Timer(delay, taskPerformer);
                  actiontimer.start();}

2 个答案:

答案 0 :(得分:4)

您可以这样做,这可以避免将参数声明为最终参数。

public void timedMain(Point current, Point wanted) {
      final Point c = current;
      final Point w = wanted;
      ActionListener taskPerformer = new ActionListener(){
          public void actionPerformed(ActionEvent evt){
              System.out.println(w + " " + c);}};
              actiontimer = new Timer(delay, taskPerformer);
              actiontimer.start();}

或者您可以更改currentwanted的类型,以便它们是可变的Point持有者,并使用actionPerformed方法查看持有者中的当前值

但是没有办法声明内部类,以便它可以看到对封闭方法范围中的变量所做的更改...如果这是你想要做的。

答案 1 :(得分:1)

你可以做一些事情

  • 您可以将匿名动作侦听器提升为(私有静态)内部类,并将参数传递给构造函数

  • 您可以定义一个构建匿名动作侦听器的函数,而不是在代码中内联它,并使该函数的参数最终

虽然将它们标记为“最终”有什么问题?