2009-09-16 8 views
3

Pourquoi ce code n'imprime jamais "Hello2"?Pourquoi/quand ComponentListener.componentShown() est appelé?

public class Test4 { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     JPanel p = new JPanel(); 
     f.getContentPane().add(p); 

     JLabel x = new JLabel("Hello"); 
     p.add(x); 

     p.addComponentListener(new ComponentListener() { 

      public void componentResized(ComponentEvent arg0) { 
       System.err.println("Hello1"); 
      } 

      public void componentMoved(ComponentEvent arg0) { 
      } 

      public void componentShown(ComponentEvent arg0) { 
       System.err.println("Hello2"); 
      } 

      public void componentHidden(ComponentEvent arg0) { 
      } 
     }); 

     f.setVisible(true); 
     f.pack(); 
    } 
} 

Répondre

3

Je suppose qu'elle est appelée lorsque l'état de visibilité de l'objet réel change. Dans ce cas, vous modifiez la visibilité du cadre et non du panneau. (par défaut, Frame commence à être masqué, mais les panneaux sont visibles) Essayez d'ajouter l'écouteur à l'image.

+0

oui, c'est vrai je relis l'api doc. Je vous remercie. – PeterMmm

0

De Java Tutorials

Le caché composant et événements montré composants se produisent seulement comme le résultat des appels à une méthode setVisible de composants. Par exemple, une fenêtre peut être miniaturisée en une icône (iconifiée) sans qu'un événement soit masqué.

2

La définition de «visible» par AWT peut être un peu contre-intuitive. De la Javadoc de java.awt.Component # isVisible:

"Components are initially visible, with the exception of top level components such as 
Frame objects." 

Selon cette description, pis already visible before you add the ComponentListener. In fact, you can verify this if you insert a

System.out.println(p.getVisible()); 

anywhere before you call f.setVisible(true). Dans ce sens, la visibilité n'est pas modifiée lors de l'affichage de la trame et par conséquent, componentShown (..) n'est pas appelée.

Questions connexes