2010-03-11 3 views
3

Comment suivre le mouvement d'une JFrame? Je voudrais enregistrer un écouteur qui serait rappelé chaque fois que JFrame.getLocation() va retourner une nouvelle valeur.Java: comment enregistrer un écouteur qui écoute un mouvement JFrame

EDIT Voici un code indiquant que la résolution est accepté répondu mon problème:

import javax.swing.*; 

public class SO { 

    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeAndWait(new Runnable() { 
      public void run() { 
       final JFrame jf = new JFrame(); 
       final JPanel jp = new JPanel(); 
       final JLabel jl = new JLabel(); 
       updateText(jf, jl); 
       jp.add(jl); 
       jf.add(jp); 
       jf.pack(); 
       jf.setVisible(true); 
       jf.addComponentListener(new ComponentListener() { 
        public void componentResized(ComponentEvent e) {} 
        public void componentMoved(ComponentEvent e) { 
         updateText(jf, jl); 
        } 
        public void componentShown(ComponentEvent e) {} 
        public void componentHidden(ComponentEvent e) {} 
       }); 
      } 
     }); 
    } 

    private static void updateText(final JFrame jf, final JLabel jl) { 
     // this method shall always be called from the EDT 
     jl.setText("JFrame is located at: " + jf.getLocation()); 
     jl.repaint(); 
    } 

} 
+0

Notez que ce n'est pas une question sur la conception orientée objet, ni sur l'utilisation ou non-utilisation de * finale *, etc. La question est de savoir comment enregistrer un rappel qui peut être déclenché chaque fois que la position du JFrame change et le morceau de code est juste un hack rapide agissant comme une preuve de concept pour brancher la bonne réponse. – cocotwo

Répondre

5
JFrame jf = new JFrame(); 
jf.addComponentListener(new ComponentListener() {...}); 

est ce que vous cherchez, je pense.

1

Vous pouvez enregistrer un HierarchyBoundsListener sur votre JFrame, ou utilisez un ComponentListener comme suggéré par d'autres.

jf.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter() { 

    @Override 
    public void ancestorMoved(HierarchyEvent e) { 
     updateText(jf, jl); 
    } 
}); 
7

En utilisant addComponentListener() avec un ComponentAdapter:

jf.addComponentListener(new ComponentAdapter() { 
    public void componentMoved(ComponentEvent e) { 
     updateText(jf, jl); 
    } 
}); 
+0

+1: J'aurais accepté votre réponse depuis que vous avez fourni des liens et un exemple de travail :) –

+0

@mmyers: merci beaucoup, +1 – cocotwo

+0

J'aurais accepté quelle que soit la réponse postée en premier. Il n'est pas nécessaire de fournir un lien vers l'API. La réponse est d'utiliser un ComponentListener. Chaque programmeur devrait avoir un accès direct à l'API et devrait savoir comment l'utiliser. Si vous voulez fournir un lien, alors il devrait être au tutoriel Swing sur "Comment écrire un écouteur de composants". De cette façon, quand l'affiche sera là, ils trouveront également une section sur la façon d'écrire les auditeurs de tous les autres auditeurs de l'événement Swing. Donnons aux gens les outils nécessaires pour résoudre les problèmes eux-mêmes plutôt que de s'attendre à ce que nous nourrissions la réponse tout le temps. – camickr

Questions connexes