Подтвердить что ты не робот

JSplitPane точно разделяет 50%

В Swing, что лучший способ заставить JSplitPane разделить два jpanels с 50% размером каждый.

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

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

4b9b3361

Ответ 1

Использование

setResizeWeight (.5d);

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

Ответ 2

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

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

private boolean painted;

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

    if (!painted) {
        painted = true;
        splitPane.setDividerLocation(0.25);
    }
}

Ответ 3

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

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

Это должно привести к тому, что разделитель будет центрирован, когда размер родительского контейнера будет установлен первым.

Ответ 4

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

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