2012-06-14 12 views
5

ho qualcosa di simile il codice qui sotto:variabili pass per ActionListener in 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); 
    } 

Tuttavia, la variabile i non è definito nel campo di applicazione della classe di ActionListener. Come posso passare la variabile?

+2

Sicuramente 'i' sarà sempre' 10' quando l'ascoltatore viene licenziato. (Non è il requisito finale 'grande ?;) –

risposta

16

Oltre alla risposta di Hovercraft, si dovrebbe notare che non si è costretti a utilizzare le classi anonime per i vostri ascoltatori. Il codice di risposta di Hovercraft è simile a quello seguente:

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: cura di spiegare il tuo downvote? –

+0

probabilmente non correzione +1 – mKorbel

+0

Mi piace questo approccio, più che fare una variabile finale nel ciclo (preferenza personale ovviamente). Un +1 per correggere il downvote – Robin

11

La variabile iè infatti nel campo di applicazione della ActionListener, ma dal momento che si sta cercando di usare una variabile locale in una classe interna, la variabile deve essere definitiva. Quindi, si potrebbe utilizzare una variabile finale per questo:

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 approccio totalmente diverso sarebbe quello di aggiungere una proprietà al pulsante, e recuperare la proprietà nel vostro ascoltatore azione. E.g.

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 ottimo suggerimento – mKorbel

+0

Questa dovrebbe essere la risposta accettata. È un approccio più semplice. Francamente, non sapevo che le proprietà possono essere aggiunte a pulsanti del genere. Bella risposta. –

+0

Perché questa non è la risposta accettata? –