2017-08-04 1 views
1

Ich habe eine schwimmfähige Toolbar, die der Benutzer zu seiner Bequemlichkeit bewegen kann und ich möchte die letzte Position behalten, damit er sie beim nächsten Start an derselben Stelle findet.Floatable JToolBar Position erhalten, wenn es sich ändert

Ich benutze ein BorderLayout, so dass die Symbolleiste kann Nord, Süd, Ost oder West angedockt werden (oder in einem separaten Rahmen), so kann ich BorderLayout.getConstraints() aufrufen, um seine BorderLayout-Einschränkung zu erhalten.

Ich registrierte ein AncestorListener, um den Rückruf ancestorMoved() zu fangen, aber es wird irgendwie zufällig genannt. A ComponentListener hat den gleichen Effekt (componentMoved() Rückruf).

Wenn ich die Symbolleisteneinschränkungen in regelmäßigen Abständen abfrage, obwohl ich sehen kann, ändern, so könnte ich nur abfragen, wenn meine Anwendung beendet wird, aber ich würde gerne verstehen, warum mein Hörer nicht aufgerufen wird, wie ich es erhofft hatte gewesen.

Ausführen der folgenden SSCCE auf meinem Ubuntu Oracle JDK 1.7_80, verschiebe ich die Symbolleiste von Nord nach West -> keine Ausgabe. West nach Süd -> funktioniert. Von Süden nach Osten -> funktioniert. Ost nach Nord -> funktioniert. Von Norden nach Westen -> keine Ausgabe, ... Gleiches Verhalten auf Oracle JDK 1.8.0_102 und auch auf 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); 
    } 

} 

Antwort

2

Ich vermute, dass Sie kein Ereignis erhalten, wenn die Symbolleiste von NORTH nach WEST verschoben wird, da sich die Position nicht ändert. Das heißt, es befindet sich immer noch bei (0, 0) des Inhaltsbereichs.

Ich würde vorschlagen, Sie verwenden eine ComponentListener und hören für componentMoved und componentResized Ereignisse.

Verwandte Themen