2012-06-14 33 views
5

que tienen algo así como el código de abajo:las variables Pass a ActionListener en Java

for(int i=0;i<10;i++){ 
     button=new JButton(buttons[i]); 
     button.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       setPage(i); 
      } 
     }); 
     menu.add(button); 
    } 

Sin embargo, la variable i no está definido en el ámbito de la clase ActionListener. ¿Cómo puedo pasar la variable?

+2

Surely 'i' siempre será' 10' cuando el oyente sea despedido. (¿No es grandioso el requisito 'final' ?;) –

Respuesta

16

Además de la respuesta de aerodeslizador, debe tener en cuenta que usted no está obligado a utilizar las clases anónimas para sus oyentes. El código de la respuesta del aerodeslizador es similar a la siguiente:

private class PageActionListener implements ActionListener { 
    private int page; 

    public PageActionListener(int page) { 
     this.page = page; 
    } 

    public void actionPerformed(ActionEvent e) { 
     setPage(page); 
    } 
} 

... 

for(int i = 0; i < 10; i++){ 
    button = new JButton(buttons[i]); 
    button.addActionListener(new PageActionListener(i)); 
    menu.add(button); 
} 
+1

downvoter: ¿le importa explicar su voto a favor? –

+0

probablemente no corrección +1 – mKorbel

+0

Me gusta este enfoque, más que hacer una variable final en el ciclo (preferencia personal, por supuesto). A +1 para corregir el downvote – Robin

11

La variable i es, de hecho, en el ámbito de la ActionListener, pero ya que usted está tratando de utilizar una variable local en una clase interna, la variable debe ser final. Por lo tanto, se puede utilizar una variable final para esto:

for(int i=0;i<10;i++){ 
    final int index = i; 
    button=new JButton(buttons[i]); 
    button.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      setPage(index); 
     } 
    }); 
    menu.add(button); 
} 
15

Un enfoque totalmente diferente sería añadir un alojamiento a la tecla, y recuperar esa propiedad en su oyente de action. P. ej.

button=new JButton(buttons[i]); 
button.putClientProperty("page", i); 
button.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     setPage((Integer)((JButton)e.getSource()).getClientProperty("page")); 
    } 
}); 
+0

+1 gran sugerencia – mKorbel

+0

Esta debería ser la respuesta aceptada. Es un enfoque más simple. Francamente, no sabía que las propiedades se pueden agregar a botones como ese. Gran respuesta. –

+0

¿Por qué esta no es la respuesta aceptada? –

Cuestiones relacionadas