Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pb SwingUtilities

    23 avril 2017 à 23:12:21

    Bonjour,

    Je ne comprends pas pourquoi mon programme ne marche comme il devrait (ou plutot comme je pensais ;))

    Je crée une fenêtre toute simple dans la quelle j'incrémente la valeur de mon bouton. Je m'attendais à voir défiler les valeurs 1,2,3,.jusqu'à 99. Or en réalite l'interface se fige, et je n'obtiens que le résultat final 99 qui s'affiche. Si je fais mon incrémentation en dehors de SwingUtilities, ça marche bien par contre. Mais pourquoi ici ça ne marche ?

    Merci !

    public class Test1 {
    	static int count = 0;
    	static JButton bouton = new JButton("Pause");
    
    	public static void main(String[] args) throws InterruptedException {
    
    		JFrame fen = new JFrame("EDT");
    		fen.getContentPane().add(bouton);
    		fen.setSize(200, 100);
    		fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fen.setLocationRelativeTo(null);
    		fen.setVisible(true);
    		
    
    	
    			SwingUtilities.invokeLater(new Runnable() {
    
    				@Override
    				public void run() {
    					System.out.println(Thread.currentThread().getName());
    					for (int i=0; i<100; i++) {
    						bouton.setText(""+i);
    						try {
    							Thread.sleep(10);
    						} catch (InterruptedException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    					}
    					
    				}
    				
    			});



    • Partager sur Facebook
    • Partager sur Twitter
      24 avril 2017 à 13:12:09

      Il faut que tu indique à ton programme de rafraîchir la fenêtre, en rajoutant fen.repaint()
      • Partager sur Facebook
      • Partager sur Twitter
        24 avril 2017 à 17:22:58

        florent m a écrit:

        Il faut que tu indique à ton programme de rafraîchir la fenêtre, en rajoutant fen.repaint()


        Merci

        Mais il y a toujours quelque chose que j'ai du mal à comprendre.

        Pourquoi lorsque je fais ma boucle à l'intérieur du thread main les mises à jours se font automatiquement alors qu'avec les méthodes statiques de SwingUtilities il faut faire un repaint() ?

        Cela provient il du fait que dans le invokeLater(), on fait le traitement directement dans l'EDT et l'EDT ne peut simultanément faire des traitements et gérer l'affichage alors qu'avec le thread main on a deux threads : un thread main qui fait le calcul et le thread EDT qui gère en parallèle l'affichage ?

        -
        Edité par ZagEscart 24 avril 2017 à 17:25:11

        • Partager sur Facebook
        • Partager sur Twitter

        Pb SwingUtilities

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown