Donc, je suis relativement nouveau à java (autodidacte donc j'adorerais tout conseil/critique que vous pourriez donner) et comme pratique, j'ai décidé de créer un programme roulant avec swing en utilisant Jbuttons comme Dé. Pour simuler le lancer de dés, j'ai voulu changer aléatoirement le texte du Jbutton à des nombres différents pendant quelques secondes avant de présenter le résultat.Problème de modification du texte JButton à plusieurs reprises depuis la méthode ActionPerformed
La méthode que j'ai écrite pour faire cela a semblé fonctionner jusqu'à ce que j'essaie d'appeler si à partir de la méthode ActionPerformed. Quand je l'ai fait, le programme gèle jusqu'à la fin de la méthode, puis change le texte des boutons pour le résultat final. Je étais curieux de savoir si quelqu'un pouvait expliquer pourquoi cela se produit, ou apprenez-moi la bonne façon de faire quelque chose comme ça. Merci pour toute aide.
Bellow est un exemple rapide de la même question
package experiments.changingtext;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ChangingText extends JFrame implements ActionListener{
JButton button = new JButton("Change Me");
public ChangingText(){
this.setSize(200,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pane = new JPanel();
button.addActionListener(this);
pane.add(button);
this.add(pane);
this.setVisible(true);
try{Thread.sleep(500);}catch(Exception ex){}
//Works as expected
this.changeButtonText();
}
@Override
public void actionPerformed(ActionEvent e) {
//when run program freezes and presents the final text "change to 5"
if(e.getSource() == button){
button.setText("change to 1");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 2");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 3");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 4");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 5");
}
}
public void changeButtonText(){
button.setText("change to 1");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 2");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 3");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 4");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 5");
}
}
swing utilise un seul thread pour gérer les événements et la peinture, cela signifie que nous vous utilisez Thread.sleep, vous bloquer le thread envoi d'événements, l'empêchant de peindre l'interface utilisateur. Au lieu de cela, vous pouvez utiliser un minuteur Swing – MadProgrammer