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) Метод с присваивает размер в процентах вместо абсолютного значения.

Другие вопросы по тегам