如何在启动时为 JSplitPane 设置分隔符位置
How to set divider location for JSplitPane on start-up
我有一个包含 JSplitPane 的 JPanel。 JPanel 在运行时使用方法 invokeAndWait 注入到 JFrame 中。然后调用 invokeLater 来更新 SplitPane 中的分隔符位置。
问题是,调用分隔符更新时,JPanel 宽度仍然是 0。
当我在代码中的任何位置(invokeLater 除外)添加睡眠或断点时,代码工作正常。
final JPanel viewPanel = new JPanel();
viewPanel.setLayout(new BorderLayout());
final JPanel header = getPresenterHeader(getPageTitle(), getPageInstructions());
viewPanel.add(header, BorderLayout.NORTH);
viewPanel.add(getSplitPane(), BorderLayout.CENTER);
toolbar = createActionsToolBar();
toolbar.addAction(new ExitPresenterAction(this));
viewPanel.add(toolbar, BorderLayout.SOUTH);
addContent(viewPanel);
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
splitPane.setDividerLocation(0.5);
}
});
我不确定它是否对你有帮助,但我们有一种方法在这种情况下最有帮助:
public static JSplitPane setDividerLocation(final JSplitPane splitter, final double proportion) {
if (splitter.isShowing()) {
if ((splitter.getWidth() > 0) && (splitter.getHeight() > 0)) {
splitter.setDividerLocation(proportion);
} else {
splitter.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent ce) {
splitter.removeComponentListener(this);
setDividerLocation(splitter, proportion);
}
});
}
} else {
splitter.addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
if (((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) && splitter.isShowing()) {
splitter.removeHierarchyListener(this);
setDividerLocation(splitter, proportion);
}
}
});
}
return splitter;
}
用它代替invokeLater
调用
setDividerLocation(splitPane, 0.5);
我有一个包含 JSplitPane 的 JPanel。 JPanel 在运行时使用方法 invokeAndWait 注入到 JFrame 中。然后调用 invokeLater 来更新 SplitPane 中的分隔符位置。
问题是,调用分隔符更新时,JPanel 宽度仍然是 0。
当我在代码中的任何位置(invokeLater 除外)添加睡眠或断点时,代码工作正常。
final JPanel viewPanel = new JPanel();
viewPanel.setLayout(new BorderLayout());
final JPanel header = getPresenterHeader(getPageTitle(), getPageInstructions());
viewPanel.add(header, BorderLayout.NORTH);
viewPanel.add(getSplitPane(), BorderLayout.CENTER);
toolbar = createActionsToolBar();
toolbar.addAction(new ExitPresenterAction(this));
viewPanel.add(toolbar, BorderLayout.SOUTH);
addContent(viewPanel);
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
splitPane.setDividerLocation(0.5);
}
});
我不确定它是否对你有帮助,但我们有一种方法在这种情况下最有帮助:
public static JSplitPane setDividerLocation(final JSplitPane splitter, final double proportion) {
if (splitter.isShowing()) {
if ((splitter.getWidth() > 0) && (splitter.getHeight() > 0)) {
splitter.setDividerLocation(proportion);
} else {
splitter.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent ce) {
splitter.removeComponentListener(this);
setDividerLocation(splitter, proportion);
}
});
}
} else {
splitter.addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
if (((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) && splitter.isShowing()) {
splitter.removeHierarchyListener(this);
setDividerLocation(splitter, proportion);
}
}
});
}
return splitter;
}
用它代替invokeLater
调用
setDividerLocation(splitPane, 0.5);