我有没有办法将变量传递给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();}
答案 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();}
或者您可以更改current
和wanted
的类型,以便它们是可变的Point
持有者,并使用actionPerformed
方法查看持有者中的当前值
但是没有办法声明内部类,以便它可以看到对封闭方法范围中的变量所做的更改...如果这是你想要做的。
答案 1 :(得分:1)
你可以做一些事情
您可以将匿名动作侦听器提升为(私有静态)内部类,并将参数传递给构造函数
您可以定义一个构建匿名动作侦听器的函数,而不是在代码中内联它,并使该函数的参数最终
虽然将它们标记为“最终”有什么问题?