Как установить расположение делителя для JSplitPane при запуске
У меня есть JPanel, который содержит JSplitPane. JPanel вводится во время выполнения в JFrame с использованием метода invokeAndWait. Затем вызывается invokeLater для обновления расположения разделителя в SplitPane.
Проблема в том, что когда вызывается обновление делителя, ширина JPanel по-прежнему равна 0.
Когда я добавляю sleep или точку останова где-либо в коде (кроме 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);
}
});
1 ответ
Решение
Я не уверен, поможет ли это вам, но у нас есть метод, который в основном помогает в этой ситуации:
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);