2012-12-17 30 views
0

好的,所以我无法在其他地方找到我需要的东西,所以在这里。将一个变量传递给一个ActionListener

我该如何去将一个变量传递给一个ActionListener()内的函数?这是我的代码。

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      currentRect = (y * 5) + x; 
      mainButtons.get(currentRect).addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent event) { 
        answerField.setText(questions.get(currentRect).getAnswer()); 
       } 
      }); 
     } 
    } 

该错误是上线6,在那里它强调“currentRect”,然后抱怨此,

无法指非最终变量currentRect在一个限定的内类的内部不同方法

什么是不是通过一组Jbutton将(javax.swing中)的迭代,然后分配适当的动作侦听器基于它们在该ArrayList位置,但是,我似乎无法将存储其位置的变量传递给actionlistener本身,所以我卡住了。我意识到,即时通讯写这个,我应该真的使用一个foreach,所以后来改变了。 (只是对谁指出的一点点说明)我意识到我不能最终做出这个变量,因为它在for循环期间被改变了。我也尝试将currentRect((y * 5)+ x)的值传递给函数,但无济于事。

感谢,

andrewgies17

+0

你能从'event'对象中得到你需要的东西吗? – gMale

+0

由于错误消息提示,您可以将'currentRect'声明为'final'来满足编译器。这是否是一个好设计完全是另一回事。 –

回答

2

解决方法很简单,只需声明一个新的最后一个变量的块内:

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      final int currentRect = (y * 5) + x; 

,或者如果你需要的块外currentRect的价值:

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      currentRect = (y * 5) + x; 
      final int currentRect2 = currentRect; 

,你在使用的,而不是currentRect currentRect2你的匿名课程。这是违反直觉的,因为它看起来像变量每次都重新初始化,但事实上,您必须将此视为一个新变量,该变量仅对该块的每个循环初始化一次。

但是,这不是解决这个问题的最明智的方式;因为你正在为每个按钮创建一个全新的匿名类,仅仅是为了存储一个不同的小值。这些可以快速添加在有限的设备上。更好的主意是将currentRect的值作为每个按钮的标签存储。这样,您可以在外部类中声明匿名类的单个实例,并将其用于所有按钮。