Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Swing : JSplitPane split two component equals size at start up

Tags:

java

swing

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 :)

like image 405
hqt Avatar asked Dec 07 '13 03:12

hqt


3 Answers

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.

like image 109
Paul Samsotha Avatar answered Oct 31 '22 10:10

Paul Samsotha


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.

like image 26
camickr Avatar answered Oct 31 '22 11:10

camickr


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. 
like image 1
Masudul Avatar answered Oct 31 '22 11:10

Masudul