2010-11-18 159 views
2

有没有办法让我将变量传递给actionlistener而不将它们作为final来调用呢?我想以某种定时的方式使用这两点......我尝试过使用Thread.sleep(),但由于某种原因,它与该程序的其余部分没有良好的配合。这是我真正想使用的格式,但我意识到可能无法使其工作。 我愿意接受任何建议。谢谢!将变量传递给Java ActionListener?

(对不起,如果这是一个愚蠢的问题,我已经找了一个答案,但似乎无法找到一个。)

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();} 

回答

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方法看在持有人的当前值。

但是没有办法声明内部类,以便它可以看到对封闭方法范围中的变量所做的更改......如果这是您正在尝试执行的操作。

+0

这似乎工作得很好,因为我打算使用此代码段。感谢您的及时回复,您是一位救生员。 – whuff739 2010-11-18 05:30:16

1

你可以做一些事情

  • 你能促进匿名动作监听一个(私人静态)内部类,并传递参数给构造

  • 您可以定义建立了一个匿名动作里的函数而不是将它内联到你的代码中,并且使参数到那个函数final

然而,只是标记它们'最终'有什么问题?

+0

感谢您的及时回复......我还没有看过匿名行动的听众,我现在正在看这个。 – whuff739 2010-11-18 05:28:17

+0

你的'taskPerformer'是一个匿名动作监听器。也就是说,当你去'new ActionListner(){...}并且该子类没有(源代码)名称时,会定义一个ActionListner的新子类。 – 2010-11-18 06:35:22