В Swing, что лучший способ заставить JSplitPane разделить два jpanels с 50% размером каждый.
Похоже, если я не задаю предпочтительные размеры на панелях, он всегда делает первую панель почти невидимой (2%), а вторую (98%)
Заранее спасибо
В Swing, что лучший способ заставить JSplitPane разделить два jpanels с 50% размером каждый.
Похоже, если я не задаю предпочтительные размеры на панелях, он всегда делает первую панель почти невидимой (2%), а вторую (98%)
Заранее спасибо
Использование
setResizeWeight (.5d);
[...] Значение 0 по умолчанию указывает, что правый/нижний компонент получает все лишнее пространство (левый/верхний компонент действует фиксированным), где, когда значение 1 указывает, что компонент left/top получает все дополнительное пространство (правый/нижний компонент действует фиксированным). [...]
Вы должны использовать 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);
}
}
У меня была аналогичная проблема, и я решил ее, используя компонентный прослушиватель в родительском контейнере и задав местоположение делителя при первом изменении размера. Инициализируйте переменную firstResize в true и добавьте ее в родительский конструктор контейнера:
addComponentListener(new ComponentAdapter(){
@Override
public void componentResized(ComponentEvent e) {
if(firstResize){
splitPane.setDividerLocation(0.5);
firstResize = false;
}
}
});
Это должно привести к тому, что разделитель будет центрирован, когда размер родительского контейнера будет установлен первым.
Решения здесь не учитывают случай, когда пользователь перемещает делитель (т.е. место с переменным делителем). Полный пример, который учитывает это, доступен здесь: