更改时获取可浮动的 JToolBar 位置

Get floatable JToolBar position when it changes

我有一个可浮动的工具栏,用户可以在他方便的时候四处移动,我想保留最后的位置,以便他在下次启动时在相同的位置找到它。

我正在使用 BorderLayout,因此工具栏可以停靠在北、南、东或西(或位于单独的框架中),因此我可以调用 BorderLayout.getConstraints() 来获取它的 BorderLayout 约束。

我注册了一个AncestorListener to catch the ancestorMoved() callback but it gets called somehow randomly. A ComponentListener效果一样(componentMoved()回调)

如果我定期查询工具栏约束虽然我可以看到它发生变化,所以我可以在我的应用程序退出时查询它,但我想了解为什么我的侦听器没有像我希望的那样被调用去过。

运行 我的 Ubuntu Oracle JDK 上的以下 SSCCE 1.7_80,我将工具栏从北移到西 -> 没有输出。从西向南 -> 作品。从南到东 -> 作品。从东到北 -> 作品。从北到西 -> 无输出,... 在 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);
    }

}

我猜当工具栏从 NORTH 移到 WEST 时您不会收到事件,因为位置没有改变。也就是说它仍然位于内容窗格的 (0, 0)。

我建议您使用 ComponentListener 并监听 componentMovedcomponentResized 事件。