2009-12-05 8 views
0

alors quand j'exécute ce code pour essayer de changer l'arrière-plan, l'interface graphique plante et reste bloquée dans une boucle infinie tout en ignorant les écouteurs d'événements. voici le code:while loop ignore l'écouteur d'événement

private Panel getPanel1() { 
     if (panel1 == null) { 
      panel1 = new Panel(); 
      panel1.setLayout(new GridBagLayout()); 
      while(frame.isVisible()){ 
       panel1.addMouseListener(new java.awt.event.MouseAdapter() { 
        public void mouseClicked(java.awt.event.MouseEvent e) { 
         frame.setVisible(false); 
        } 
       }); 
       int r = (int) (Math.random()*255); 
       int g = (int) (Math.random()*255); 
       int b = (int) (Math.random()*255); 
       Color c = new Color(r, g, b); 
       panel1.setBackground(c); 
       try { 
        Thread.sleep(4000); 
       } catch (InterruptedException e1) { 
        e1.printStackTrace(); 
       } 
       panel1.addMouseListener(new java.awt.event.MouseAdapter() { 
        public void mouseClicked(java.awt.event.MouseEvent e) { 
         /*panel1.setVisible(false); 
         frame.setVisible(false);*/ 
         System.exit(0); 
        } 
       }); 
      } 
     } 
     return panel1; 
} 

au lieu de sortir de la boucle de mettre fin au programme ou événement qui change l'arrière-plan, il affiche juste le panneau et ne fait rien d'autre et je dois le forcer à cesser de fumer. que devrais-je faire?

Répondre

0

Vous bloquez le thread d'interface utilisateur en appelant le sleep dans une boucle. Dans cette boucle, vous ajoutez également deux écouteurs à chaque itération, ce qui est assez bizarre.

Ne pas bloquer le filetage de l'interface utilisateur. Laissez le cadre GUI s'occuper de la livraison des événements, etc. Vous devez essentiellement adopter une approche basée sur les événements pour l'interface utilisateur, plutôt que l'approche que vous utilisez actuellement, qui ne laissera jamais aucun événement se déclencher (car vous ne revenez jamais contrôle à l'appelant).

Créez le panneau, ajoutez l'écouteur d'événement approprié, puis renvoyez-le à l'appelant. Si vous souhaitez changer la couleur d'arrière-plan toutes les 4 secondes, vous devez le faire via a timer afin qu'il ne bloque pas le thread d'interface utilisateur en attente de l'expiration des 4 secondes.