JSplitPane расщепление 50% точно - PullRequest
23 голосов
/ 22 февраля 2010

в качелях, Каков наилучший способ сделать JSplitPane разделить две jpanels размером 50% каждая.

Похоже, что если я не установлю предпочтительные размеры для панелей, это всегда делает первую панель почти невидимой (2%), а вторую (98%)

Заранее спасибо

Ответы [ 4 ]

29 голосов
/ 22 февраля 2010

Вы должны использовать setDividerLocation(double proportionalLocation), чтобы определить начальное распределение пространства для JSplitPane, а затем вызвать setResizeWeight(double) с тем же значением, чтобы убедиться, что размеры панелей изменяются. в пропорции.

Также имейте в виду: вызов setDividerLocation(double) до того, как JSplitPane станет видимым не будет работать правильно , так как вычисление пространства основано на текущем размере Component. Вместо этого вам нужно задействовать неприятный хак, например, переопределить метод рисования JPanel, который содержит JSplitPane:

private boolean painted;

@Override
public void paint(Graphics g) {
    super.paint(g);

    if (!painted) {
        painted = true;
        splitPane.setDividerLocation(0.25);
    }
}
26 голосов
/ 22 февраля 2010

Используйте

setResizeWeight(.5d);

[...] Значение 0, по умолчанию, указывает, что правый / нижний компонент получает все дополнительное пространство (левый / верхний компонент действует фиксированным), где в качестве значения 1 указывается левый / верхний компонент, который получает все лишнее пространство (правый / нижний компонент действует фиксированным). [...]

4 голосов
/ 30 сентября 2013

У меня была похожая проблема, и я решил ее, используя компонентный слушатель в родительском контейнере и установив расположение делителя при первом изменении размера. Инициализируйте переменную firstResize в true и добавьте ее в конструктор родительского контейнера:

addComponentListener(new ComponentAdapter(){
    @Override
    public void componentResized(ComponentEvent e) {
        if(firstResize){
            splitPane.setDividerLocation(0.5);
            firstResize = false;
        }
    }
});

Это должно привести к центрированию разделителя при первом задании размера родительского контейнера.

0 голосов
/ 18 марта 2016

Решения здесь не учитывают случай, когда пользователь перемещает разделитель (то есть переменное расположение разделителя). Полный пример, который учитывает это, доступен здесь:

Как заставить JSplitPane сохранять то же пропорциональное местоположение, если пользователь переместил местоположение разделителя

...