В 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;
}
}
});
Это должно привести к тому, что разделитель будет центрирован, когда размер родительского контейнера будет установлен первым.
Решения здесь не учитывают случай, когда пользователь перемещает делитель (т.е. место с переменным делителем). Полный пример, который учитывает это, доступен здесь: