私は浮動可能なツールバーを持っていますので、ユーザーは都合の良いときに移動でき、次の開始時に同じ位置でそれを見つけるように最後の位置を保持します。私が使用している変更時に浮動可能なJToolBarの位置を取得する
BorderLayout
ので、ツールバーは北、南、東または西にドッキングすることができます(または別のフレームにある)ので、私はそのBorderLayoutの制約を取得するためにBorderLayout.getConstraints()
を呼び出すことができますよ。
ancestorMoved()
コールバックをキャッチするためにAncestorListener
を登録しましたが、何とかランダムに呼び出されます。 ComponentListener
にも同じ効果があります(componentMoved()
コールバック)。
私はそれが変化するのを見ることができますが、ツールバーの制約を定期的に照会すると、アプリケーションが終了したときにクエリを実行するだけで、リスナーが呼び出されない理由を知りたいと思いますされました。
私のUbuntu Oracle JDK 1.7_80で次のSSCCEを実行すると、ツールバーをNorthからWestに移動して出力しません。西から南へ - >作品。南から東へ - >作品。東から北へ - >作品。北から西 - >出力なし... Oracle JDK 1.8.0_102と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);
}
}