In Swing, what\'s the best way to make the JSplitPane to split two jpanels with 50% size each.
It looks like if I don\'t set preferred sizes on the panels it always make
Use
setResizeWeight(.5d);
[...] A value of 0, the default, indicates the right/bottom component gets all the extra space (the left/top component acts fixed), where as a value of 1 specifies the left/top component gets all the extra space (the right/bottom component acts fixed). [...]
I had a similar problem and I solved it by using a component listener in the parent container and set the divider location on the first resize. Initialise a variable firstResize to true and add this into the parent container constructor:
addComponentListener(new ComponentAdapter(){
@Override
public void componentResized(ComponentEvent e) {
if(firstResize){
splitPane.setDividerLocation(0.5);
firstResize = false;
}
}
});
This should cause the divider to be centred when the parent container size is first set.
You should use setDividerLocation(double proportionalLocation) to determine the initial space distribution of the JSplitPane
, and then call setResizeWeight(double)
with the same value to ensure that the panes are resized in proportion.
Also, be aware: Calling setDividerLocation(double)
before the JSplitPane
is visible will not work correctly, as the space calculation is based on the Component
's current size. Instead you need to involve a nasty hack, such as overriding the JPanel
's paint method that contains the JSplitPane
:
private boolean painted;
@Override
public void paint(Graphics g) {
super.paint(g);
if (!painted) {
painted = true;
splitPane.setDividerLocation(0.25);
}
}
The solutions here do not take into account the case where the user moves the divider (i.e. a variable divider location). A complete example that takes this into account is available here:
How do you get JSplitPane to keep the same proportional location if the user has moved the location of the divider