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);
}
}