2017-06-09 1 views
0

Ursprünglich habe ich eine JFrame haben 3 Tasten: welche Taste 0 drucken 0 beim Anklicken der Taste 1 prints 1 und so weiter:Warum haben diese 2 ähnlichen for loop unterschiedliche Ergebnisse beim Hinzufügen von ActionListener zu JButton?

JFrame jframe=new JFrame(); 
jframe.getContentPane().setLayout(new GridLayout(3,1)); 
for(int i=0;i<3;i++){ 
    final int j=i; 
    JButton jbutton=new JButton(""+j); 
    jframe.getContentPane().add(jbutton); 
    jbutton.setPreferredSize(new Dimension(100,100)); 
    jbutton.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      System.out.println(""+j); 
     } 
    }); 
} 
jframe.setVisible(true); 
jframe.pack(); 
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Ich mag 1 Zeile reduzieren aufgrund des letzten Variable und damit Umgestalten der for-Schleife wie folgt aus:

JFrame jframe=new JFrame(); 
jframe.getContentPane().setLayout(new GridLayout(3,1)); 
for(final int[] arr={0};arr[0]<3;arr[0]++){ 
    JButton jbutton=new JButton(""+arr[0]); 
    jframe.getContentPane().add(jbutton); 
    jbutton.setPreferredSize(new Dimension(100,100)); 
    jbutton.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      System.out.println(""+arr[0]); 
     } 
    }); 
} 
jframe.setVisible(true); 
jframe.pack(); 
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

aber dieses Mal sind alle Tasten 3 auch auf die Schaltfläche Index drucken ist noch 0,1,2, was ist der Grund?

+0

warum Sie ein Array 'für (final int [] arr = {0}; arr [0] <3; arr [0] ++) werden mit {'? –

+0

'arr [0] ++' ... was ist der Wert bei 'arr [0]' wenn die Schleife abgeschlossen ist? – MadProgrammer

Antwort

0

Im zweiten Programm übergeben Sie die gleiche Variable an alle drei Schaltflächen. Und dann erhöhen Sie den Wert der Variablen mit jeder Iteration. Daher wird der Wert für alle drei Schaltflächen aktualisiert.

Lassen Sie mich Ihnen ein einfaches Beispiel,

class Resource{ 
    int a = 10; 
} 
class A{ 
    Resource r; 
} 
class B{ 
    public static void main(String args[]){ 
     Resource r = new Resource(); 

     A o1 = new A(); 
     o1.r = r; 

     A o2 = new A(); 
     o2.r = r; 

     o1.r.a = 20; 

     System.out.println(o1.r.a); // prints 20 
     System.out.println(o2.r.a); // prints 20 too 
    } 
} 
1

Nach den Schleifenenden, i[0] ist 3. Die ActionListeners alle enthalten einen Verweis auf i und wird den gleichen Wert für i[0] lesen, die 3 ist.

jbutton.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     System.out.println(""+arr[0]); 
    } 
}); 

Wenn Sie diese korrigieren mögen, den Wert von i[0] zu einem lokalen endgültigen Variablen zuweisen und wir, dass für die Ausgabe wie:

for(int[] arr = {0}; arr[0] < 3; arr[0]++) { 
    final int val = arr[0]; 
    ... 
    jbutton.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("" + val); 
     } 
    }); 
} 
0

Der richtige Weg ist die Ereignisquelle zu bekommen, und dann brauchen Sie nicht final int

public static void main(String [] args) 
    { 
     JFrame jframe=new JFrame(); 
     jframe.getContentPane().setLayout(new GridLayout(3,1)); 
     for(int i=0;i<3;i++){ 
      JButton jbutton=new JButton(""+ i); 
      jframe.getContentPane().add(jbutton); 
      jbutton.setPreferredSize(new Dimension(100,100)); 
      jbutton.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        JButton myButton = (JButton)e.getSource(); 
        System.out.println(""+ myButton.getText()); 
       } 
      }); 
     } 
     jframe.setVisible(true); 
     jframe.pack(); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    } 
Verwandte Themen