JSplitPane сброс положения делителя
У меня есть две JSplitPanes, как так
splitPaneRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, console, tabPager);
splitPaneLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, infoPanel, splitPaneRight);
splitPaneRight.setResizeWeight(1);
и метод, который выглядит следующим образом и обычно вызывается щелчком на JMenuItem где-то еще:
public void resetLayout()
{
setSize(1280, 720);
splitPaneLeft.setDividerLocation(165);
splitPaneRight.setDividerLocation(830);
}
Интерфейс выглядит так (миниатюра кликабельна):
http://bit-stab.com/pictures/dump/MinecraftRemoteAdmin.jpg
Моя проблема заключается в том, что всякий раз, когда я перемещаю положение обоих делителей, мне нужно дважды нажать на этот пункт меню, чтобы оба делителя снова встали на свои места. Левый всегда идет в первый раз, а правый во второй.
Я попытался изменить порядок, в котором установлены разделители (сначала справа, затем слева). Я пытался сделать недействительной, разделенную панель измененного разделителя, обе разделенные панели и обе разделенные панели плюс пользовательский интерфейс (расширяет JFrame)
Я также попытался запустить метод дважды при нажатии на пункт меню. Или проверка, возвращает ли getDividerLocation() значение, которое я только что установил (что по какой-то странной причине).
И последнее, но не менее важное: я пробовал сочетания всего вышеперечисленного.
У меня заканчиваются идеи, есть ли исправление для этого?
РЕДАКТИРОВАТЬ: я создал работоспособный пример (источник: http://pastebin.com/VKtN6zJZ), download.jar
1 ответ
setSize(1280, 720);
Никогда не используйте такие жесткие размеры. Не все будут использовать монитор с одинаковым разрешением. Может быть, использовать:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
или используйте класс Toolkit, чтобы получить границы окна.
Иногда вам нужно обернуть код в SwingUtilities.invokeLater()
чтобы убедиться, что код выполняется в правильном порядке. Что-то вроде
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
splitPaneLeft.setDividerLocation(165);
splitPaneRight.setDividerLocation(830);
}
});
Если это не сработает, то, возможно, каждый оператор должен быть выполнен в отдельном invokeLater().
Тот же комментарий о местах делителя. Не кодируйте значения жестко. Может быть, вы можете использовать setDividerLocation(.25f)
Метод с присваивает размер в процентах вместо абсолютного значения.