26

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 makes the first panel almost invisible (2%) and the second one (98%)

Thanks in advance

user278731
  • 263
  • 1
  • 3
  • 4

4 Answers4

29

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);
    }
}
Adamski
  • 51,827
  • 12
  • 103
  • 150
  • +1 It works great! Only one note to the next guy who fall into this: be aware of the "minimum size" property of the components. If the minimum size is greater than the available space, the first draw of the JSplitPane will work fine, but if you resize the frame, it will be recalculated. In that case, a quick fix: `component.setMinimumSize(new Dimensions(0,0))` – José Ramón Nov 27 '13 at 09:49
28

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). [...]

Peter Lang
  • 50,721
  • 26
  • 139
  • 153
  • 6
    setResizeWeight(double) is only used to "distribute extra space when the size of the split pane changes". It does not determine the initial space distribution. – Adamski Feb 22 '10 at 15:42
4

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.

William Dutton
  • 309
  • 2
  • 6
0

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

Community
  • 1
  • 1
John
  • 2,320
  • 2
  • 17
  • 33