2017-03-07 2 views
0

J'essaye de faire un JButton sur un JPanel qui, quand on clique dessus, produit le nombre de grêlons (si le nombre est pair diviser par deux, si le nombre est impair, multiplier par 3 et en ajouter un). Cependant, quand je clique sur mon JButton, le programme se fige et aucun numéro n'est sorti. Pourquoi cela arrive-t-il?Pourquoi ce producteur de nombre de grêlons ne fonctionne-t-il pas?

Voici mon code:

import javax.swing.*; 
 
import java.awt.*; 
 
import java.awt.event.*; 
 
public class Panel03 extends JPanel { 
 
private JLabel label; 
 
private JButton button; 
 
private JTextField box; 
 

 
public Panel03() 
 
{ 
 
    box = new JTextField("0", 10); 
 
    box.setForeground(Color.black); 
 
    box.setHorizontalAlignment(SwingConstants.RIGHT); 
 
    add(box); 
 
    
 
    label = new JLabel(); 
 
    label.setFont(new Font("Serif", Font.BOLD, 20)); 
 
    label.setForeground(Color.blue); 
 
    add(label); 
 

 
    button = new JButton("Next"); 
 
    button.addActionListener(new Listener()); 
 
    add(button); 
 
} 
 

 
private class Listener implements ActionListener 
 
{ 
 
    public void actionPerformed(ActionEvent e) 
 
    { 
 
     String s = box.getText(); 
 
     int a = Integer.parseInt(s); 
 
     int b = a; 
 
     do { 
 
      if(a%2 == 0){b/=2.0;} 
 
      else{a=((3*b)+1);} 
 
      label.setText(Integer.toString(b)); 
 
     } 
 
     while(b!= 4||b!= 2||b!= 1); 
 
    } 
 
} 
 
}

+0

Chaque numéro existant est soit pas 4 ou pas 2. Peut-être que vous vouliez dire '&&' au lieu de '||'. – shmosel

+0

Vous n'utilisez pas 'a' après avoir défini la valeur dans la boucle. –

Répondre

0

Chaque fois qu'un programme se bloque, une boucle infinie est un premier suspect. Dans ce cas, l'ajout de cette ligne à la boucle

System.out.printf("* a=%d b=%d\n",a,b); 

montre que a = 0 et b = 0 pour toujours. Puisque a est zéro, a% 2 = 0, et b/= 2 est toujours zéro, donc les variables ne changent jamais. Commençant par a = 1 reste coincé à a = 4, b = 0. En fait, pour tout nombre que j'ai entré, b va à zéro et la boucle se coince. Je ne sais pas ce que vous essayez de faire ici, mais je soupçonne que votre logique de sortie de la boucle doit être et au lieu ou, et doit prendre le b = 0 possibilité:

while (b!=4 && b!=2 && b!=1 && b!=0);