10

I'm using JSplitPane includes two JScrollPane at each side. I don't know how to make them at equals size at start up. Here is my main code:

 contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
            inputTextArea = new JTextArea();
    outputTextArea = new JTextArea();

    // put two TextArea to JScrollPane so text can be scrolled when too long
    JScrollPane scrollPanelLeft = new JScrollPane(inputTextArea);
    JScrollPane scrollPanelRight = new JScrollPane(outputTextArea);

    // put two JScrollPane into SplitPane 
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
            scrollPanelLeft, scrollPanelRight);
    splitPane.setOneTouchExpandable(true);
    splitPane.setDividerLocation(650);    // still no effect
    contentPane.add(splitPane, BorderLayout.CENTER);

I have used splitPane.setDividerLocation(getWidth() / 2); but still no effect.

Please tel me how to fix this.

For more detail. Here is my full code:

package com.view;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

//import com.controller.Controller;

public class Main extends JFrame {

    private static final long serialVersionUID = 1L;

    private JPanel contentPane;
    public JTextArea inputTextArea;
    public JTextArea outputTextArea;
    private JButton inputBtn;
    private JButton outputBtn;
    private JButton sortBtn;
    public JRadioButton firstButton;
    public JRadioButton secondButton;
    public JRadioButton thirdButton;
    JSplitPane splitPane;

    //Controller controller;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Main() {
    //  controller = new Controller(this);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);  
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));

        /**
         * center
         * include two TextArea for display text
         */

        inputTextArea = new JTextArea();
        outputTextArea = new JTextArea();

        // put two TextArea to JScrollPane so text can be scrolled when too long
        JScrollPane scrollPanelLeft = new JScrollPane(inputTextArea);
        JScrollPane scrollPanelRight = new JScrollPane(outputTextArea);

        // put two JScrollPane into SplitPane 
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                scrollPanelLeft, scrollPanelRight);
        splitPane.setOneTouchExpandable(true);
        contentPane.add(splitPane, BorderLayout.CENTER);

        /**
         * Top
         * Include two button : SelectFile and WriteToFile
         * this layout includes some tricky thing to done work
         */

        // create new input button
        inputBtn = new JButton("Select File");
        // declare action. when user click. will call Controller.readFile() method 
        // (see this method for detail)
        inputBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            //  controller.readFile();
            }
        });

        // create new output button
        outputBtn = new JButton("Write To File");
        // declare action. when user click. will call Controller.writeFile() method 
        // (see this method for detail)
        outputBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            //  controller.writeFile();
            }
        });

        // put each button into seperate panel
        JPanel tmpPanel1 = new JPanel();
        tmpPanel1.add(inputBtn);
        JPanel tmpPanel2 = new JPanel();
        tmpPanel2.add(outputBtn);

        // finnally. put those two pane into TopPane
        // TopPane is GridLayout
        // by using this. we can sure that both two button always at center of screen like Demo
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new GridLayout(1, 2));
        topPanel.add(tmpPanel1);
        topPanel.add(tmpPanel2);
        contentPane.add(topPanel, BorderLayout.NORTH);

        /**
         * Bottom panel
         * Include all radionbutton and sortbutton
         */

        // Group the radio buttons.
        firstButton = new JRadioButton("Last Name");
        secondButton = new JRadioButton("Yards");
        thirdButton = new JRadioButton("Rating");
        // add those button into a group
        // so . ONLY ONE button at one time can be clicked
        ButtonGroup group = new ButtonGroup();
        group.add(firstButton);
        group.add(secondButton);
        group.add(thirdButton);

        // create sor button
        sortBtn = new JButton("Sort QB Stats");
        // add action for this button : will Call Controller.SortFile()
        sortBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            //  controller.sortFile();
            }
        });

        // add all to bottomPanel
        JPanel bottomPanel = new JPanel(new FlowLayout());
        bottomPanel.add(firstButton);
        bottomPanel.add(secondButton);
        bottomPanel.add(thirdButton);
        bottomPanel.add(sortBtn);
        contentPane.add(bottomPanel, BorderLayout.SOUTH);

        setContentPane(contentPane);
        setTitle("2013 College Quarterback Statistics");
        setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
        setVisible(true);
        System.out.println("getwidth: " + getWidth());
        splitPane.setDividerLocation(getWidth()/2);
    }

}

Thanks :)

hqt
  • 29,632
  • 51
  • 171
  • 250
  • Unless you know the size that the parent container will be before hand, there is no real way of knowing, but, based on your example, try and set the divider location AFTER you've added it to the container... – MadProgrammer Dec 07 '13 at 03:11
  • Try to set the lines and width of your JTextArea and see if that works. `JTextArea inputTextArea = new JTextArea(10, 30)`, or something of the like for both. – Paul Samsotha Dec 07 '13 at 03:43
  • @peeskillet i have tried. but still has no changed – hqt Dec 07 '13 at 03:47

3 Answers3

9

I got it right for you. I add this;

contentPane.add(splitPane, BorderLayout.CENTER);
splitPane.setResizeWeight(0.5);  <------- here :)

And I got rid of the setDviderLocation() at the bottom

Inititally sets the resize wieght property. values are 0.0 to 1.0, a double value percentage to split the pane. There's a whole lot to exaplain about preferred sizes and such that I read about in the JSplitPane tutorial, so you can check it out for yourself.

Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720
  • 1
    +1, @hqt, but you should be aware that this also affects the resizing after the frame is visible as well. – camickr Dec 07 '13 at 04:20
6

It really depends on the exact behaviour you want for the split pane.

You can use:

splitPane.setResizeWeight(0.5f);

when you create the split pane. This affects how the space is allocated to each component when the split pane is resized. So at start up it will be 50/50. As the split pane increased in size the extra space will also be split 50/50;

splitPane.setDividerLocation(.5f);

This will only give an initial split of 50/50. As the split pane size is increased, the extra space will all go to the last component. Also, note that this method must be invoked AFTER the frame has been packed or made visible. You can wrap this statement in a SwingUtilities.invokeLater() to make sure the code is added to the end of the EDT.

camickr
  • 321,443
  • 19
  • 166
  • 288
1

Initially getWidth() size is 0. Add splitPane.setDividerLocation(getWidth()/2); after setvisible(true). Try,

    // put two JScrollPane into SplitPane 
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
            scrollPanelLeft, scrollPanelRight);
    splitPane.setOneTouchExpandable(true);
   // still no effect
    add(splitPane, BorderLayout.CENTER);
    setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);

    setVisible(true);// JFrame setVisible
    splitPane.setDividerLocation(getWidth()/2); //Use setDividerLocation here. 
Masudul
  • 21,823
  • 5
  • 43
  • 58
  • As when I debug. after setVisible(). getWidth() appear real size. But it still no effect that both JScrollbar appears at same size. – hqt Dec 07 '13 at 03:33
  • I don't understand your problem. Still divider not located at middle? – Masudul Dec 07 '13 at 03:37
  • yes :(. I have update my post to have full code of view. you can take a look at it. I'm afraid that because some problem when I design layout. – hqt Dec 07 '13 at 03:43
  • @hqt, Look at your bottom of full code. You added two `splitPane.setDividerLocation(..);`. Remove last one. – Masudul Dec 07 '13 at 03:47
  • ah. I'm sorry. I added that line to checked if method setDividerLocation() work or not. remove it, still gain no result :( – hqt Dec 07 '13 at 03:53