更改时获取可浮动的 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
并监听 componentMoved
和 componentResized
事件。
我有一个可浮动的工具栏,用户可以在他方便的时候四处移动,我想保留最后的位置,以便他在下次启动时在相同的位置找到它。
我正在使用 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
并监听 componentMoved
和 componentResized
事件。