2017-08-04 2 views
1

J'ai une barre d'outils flottante que l'utilisateur peut déplacer à sa convenance et je veux garder la dernière position afin qu'il la trouve au même endroit au prochain démarrage. J'utilise un BorderLayout pour que la barre d'outils puisse être ancrée Nord, Sud, Est ou Ouest (ou être dans un cadre séparé) afin que je puisse appeler le BorderLayout.getConstraints() pour obtenir sa contrainte BorderLayout.Obtenir la position JToolBar flottante quand elle change

J'ai enregistré un AncestorListener pour intercepter le rappel ancestorMoved() mais il est appelé de façon aléatoire. Un ComponentListener a le même effet (rappel componentMoved()). Si j'interroge périodiquement les contraintes de la barre d'outils, même si je peux la voir changer, je pourrais juste l'interroger quand ma demande se terminera, mais je voudrais comprendre pourquoi mon écouteur n'est pas appelé comme j'espérais qu'il aurait été.

En exécutant le SSCCE suivant sur mon JDK 1.7_80 d'Ubuntu Oracle, je déplace la barre d'outils du Nord vers l'Ouest -> aucune sortie. Ouest vers le sud -> fonctionne. Du Sud à l'Est -> fonctionne. Est-Nord -> fonctionne. Du nord au ouest -> pas de sortie, ... Même comportement noté sur Oracle JDK 1.8.0_102 et sur Windows.

class ToolBarPos extends JFrame { 

    private static final long serialVersionUID = 1L; 

    ToolBarPos() { 
     super(); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setBounds(100, 100, 800, 600); 
     Container cp = getContentPane(); 
     final BorderLayout layout = new BorderLayout(); 
     cp.setLayout(layout); 
     final JToolBar tb = new JToolBar(); 
     cp.add(tb, BorderLayout.NORTH); 
     tb.addAncestorListener(new AncestorListener() { 
      @Override public void ancestorAdded(AncestorEvent event) { } 
      @Override public void ancestorRemoved(AncestorEvent event) { } 

      @Override public void ancestorMoved(AncestorEvent event) { 
       String pos = (String)layout.getConstraints(event.getComponent()); // null if detached 
       System.out.println("Moved "+pos+"."); 
      } 
     }); 
     tb.add(new JLabel("Element")); 
     cp.add(new JLabel("CENTER"), BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     new ToolBarPos().setVisible(true); 
    } 

} 

Répondre

2

Je devine que vous ne recevez pas un événement lorsque la barre d'outils est déplacée du Nord vers l'Ouest parce que l'emplacement ne change pas. C'est-à-dire qu'il se trouve toujours à (0, 0) du volet de contenu.

Je vous suggère d'utiliser un ComponentListener et d'écouter les événements componentMoved et componentResized.