SplitPaneDemo.java revision 13978:1993af50385d
16059Samurai/*
26059Samurai * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
36059Samurai * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
46059Samurai *
56059Samurai * This code is free software; you can redistribute it and/or modify it
66059Samurai * under the terms of the GNU General Public License version 2 only, as
76059Samurai * published by the Free Software Foundation.
86059Samurai *
96059Samurai * This code is distributed in the hope that it will be useful, but WITHOUT
106059Samurai * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
116059Samurai * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
126059Samurai * version 2 for more details (a copy is included in the LICENSE file that
136059Samurai * accompanied this code).
146059Samurai *
156059Samurai * You should have received a copy of the GNU General Public License version
166059Samurai * 2 along with this work; if not, write to the Free Software Foundation,
176059Samurai * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
186059Samurai *
198857Srgrimes * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2031828Sbrian * or visit www.oracle.com if you need additional information or have any
218857Srgrimes * questions.
226059Samurai */
2330715Sbrianpackage com.sun.swingset3.demos.splitpane;
2430715Sbrian
2526031Sbrianimport java.awt.BorderLayout;
2630715Sbrianimport java.awt.Color;
2726031Sbrianimport java.awt.Dimension;
2830715Sbrianimport java.awt.GridBagConstraints;
2926031Sbrianimport java.awt.GridBagLayout;
3030715Sbrianimport java.awt.Insets;
3130715Sbrianimport java.awt.event.ActionEvent;
3231343Sbrianimport java.awt.event.ActionListener;
3326031Sbrianimport javax.swing.*;
3431343Sbrianimport javax.swing.event.ChangeEvent;
3530715Sbrianimport javax.swing.event.ChangeListener;
3630715Sbrian
3726516Sbrianimport com.sun.swingset3.DemoProperties;
3830715Sbrianimport com.sun.swingset3.demos.ResourceManager;
3930715Sbrian
4030715Sbrian/**
4130715Sbrian * Split Pane demo
4230715Sbrian *
4330715Sbrian * @version 1.12 11/17/05
4430715Sbrian * @author Scott Violet
4530715Sbrian * @author Jeff Dinkins
4630715Sbrian */
4730715Sbrian@DemoProperties(
4831343Sbrian        value = "JSplitPane Demo",
4930715Sbrian        category = "Containers",
5030715Sbrian        description = "Demonstrates JSplitPane, a container which lays out two components in an adjustable split view (horizontal or vertical)",
5130715Sbrian        sourceFiles = {
5230715Sbrian            "com/sun/swingset3/demos/splitpane/SplitPaneDemo.java",
536059Samurai            "com/sun/swingset3/demos/ResourceManager.java",
546059Samurai            "com/sun/swingset3/demos/splitpane/resources/SplitPaneDemo.properties",
556059Samurai            "com/sun/swingset3/demos/splitpane/resources/images/day.jpg",
5631690Sbrian            "com/sun/swingset3/demos/splitpane/resources/images/night.jpg",
576059Samurai            "com/sun/swingset3/demos/splitpane/resources/images/SplitPaneDemo.gif"
586059Samurai        }
5913389Sphk)
6031343Sbrianpublic class SplitPaneDemo extends JPanel {
6126031Sbrian
6231343Sbrian    private static final ResourceManager resourceManager = new ResourceManager(SplitPaneDemo.class);
636059Samurai    public static final String VERTICAL_SPLIT = resourceManager.getString("SplitPaneDemo.vert_split");
6426142Sbrian    public static final String HORIZONTAL_SPLIT = resourceManager.getString("SplitPaneDemo.horz_split");
656059Samurai    public static final String ONE_TOUCH_EXPANDABLE = resourceManager.getString("SplitPaneDemo.one_touch_expandable");
6625630Sbrian    public static final String SECOND_COMPONENT_MIN_SIZE = resourceManager.getString("SplitPaneDemo.second_component_min_size");
6725630Sbrian    public static final String FIRST_COMPONENT_MIN_SIZE = resourceManager.getString("SplitPaneDemo.first_component_min_size");
686059Samurai    public static final String DIVIDER_SIZE = resourceManager.getString("SplitPaneDemo.divider_size");
6926940Sbrian    public static final String DEMO_TITLE = SplitPaneDemo.class.getAnnotation(DemoProperties.class).value();
7030715Sbrian
7130715Sbrian    private static final Insets insets = new Insets(4, 8, 4, 8);
7230715Sbrian
7330733Sbrian    private final JSplitPane splitPane;
7430715Sbrian    private final JLabel day;
7531080Sbrian    private final JLabel night;
766059Samurai
776059Samurai    private JPanel controlPanel;
7831822Sbrian    private GridBagLayout gridbag;
796059Samurai    private GridBagConstraints c;
8031343Sbrian
8131343Sbrian    /**
8231343Sbrian     * main method allows us to run as a standalone demo.
8331343Sbrian     *
8431343Sbrian     * @param args
8531343Sbrian     */
8631343Sbrian    public static void main(String[] args) {
8731343Sbrian        JFrame frame = new JFrame(DEMO_TITLE);
8831343Sbrian
8931343Sbrian        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
9031343Sbrian        frame.getContentPane().add(new SplitPaneDemo());
9131343Sbrian        frame.setPreferredSize(new Dimension(800, 600));
9231343Sbrian        frame.pack();
9331343Sbrian        frame.setLocationRelativeTo(null);
9431343Sbrian        frame.setVisible(true);
9531343Sbrian    }
9631343Sbrian
976059Samurai    /**
986059Samurai     * SplitPaneDemo Constructor
9931343Sbrian     */
1006059Samurai    public SplitPaneDemo() {
10128679Sbrian        setLayout(new BorderLayout());
10231372Sbrian
1036059Samurai        //<snip>Create horizontal SplitPane with day and night
10426516Sbrian        day = new JLabel(resourceManager.createImageIcon("day.jpg",
10526516Sbrian                resourceManager.getString("SplitPaneDemo.day")));
10626516Sbrian        night = new JLabel(resourceManager.createImageIcon("night.jpg",
10731343Sbrian                resourceManager.getString("SplitPaneDemo.night")));
10831343Sbrian
10931372Sbrian        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, day, night);
11031372Sbrian        //</snip>
11128679Sbrian
11228679Sbrian        //<snip>Turn on continuous layout
1136059Samurai        splitPane.setContinuousLayout(true);
11426516Sbrian        //</snip>
1156059Samurai
11631372Sbrian        //<snip>Turn on one-touch expansion
11731372Sbrian        splitPane.setOneTouchExpandable(true);
11831372Sbrian        //</snip>
11931372Sbrian
12031372Sbrian        //<snip>Set divider location
12131372Sbrian        splitPane.setDividerLocation(200);
12231372Sbrian        //</snip>
12331372Sbrian
12431372Sbrian        //<snip>Set minimum size for each child
12531372Sbrian        day.setMinimumSize(new Dimension(20, 20));
1266059Samurai        night.setMinimumSize(new Dimension(20, 20));
12731343Sbrian        //</snip>
1286764Samurai
12931372Sbrian        add(splitPane, BorderLayout.CENTER);
13031372Sbrian        setBackground(Color.black);
13131372Sbrian
13231372Sbrian        add(createSplitPaneControls(), BorderLayout.SOUTH);
1336059Samurai    }
13431372Sbrian
13526516Sbrian    /**
13626516Sbrian     * Creates controls to alter the JSplitPane.
13726516Sbrian     *
1386059Samurai     * @return
1396059Samurai     */
1406059Samurai    protected final JPanel createSplitPaneControls() {
14130913Sbrian
1426059Samurai        gridbag = new GridBagLayout();
14331343Sbrian        c = new GridBagConstraints();
1446059Samurai        controlPanel = new JPanel(gridbag);
14520120Snate
14620120Snate        //<snip>Create radio box to edit splitpane orientation
14725908Sbrian        Box box = Box.createHorizontalBox();
14825908Sbrian        ButtonGroup group = new ButtonGroup();
14920120Snate
15010528Samurai        OrientationListener orientationListener = new OrientationListener();
1516059Samurai
15210528Samurai        JRadioButton button = new JRadioButton(VERTICAL_SPLIT);
1536059Samurai        button.setActionCommand("vertical");
15410528Samurai        button.addActionListener(orientationListener);
1556059Samurai        group.add(button);
15630913Sbrian        box.add(button);
15726516Sbrian
15826516Sbrian        button = new JRadioButton(HORIZONTAL_SPLIT);
1596059Samurai        button.setActionCommand("horizontal");
16026516Sbrian        button.setSelected(true);
1616059Samurai        button.addActionListener(orientationListener);
1626059Samurai        group.add(button);
1636059Samurai        box.add(button);
16431343Sbrian        //</snip>
1656059Samurai
16611336Samurai        addToGridbag(box, 0, 0, 1, 1,
16726858Sbrian                GridBagConstraints.NONE, GridBagConstraints.WEST);
16811336Samurai
1696059Samurai        //<snip>Create checkbox to edit continuous layout
17026516Sbrian        JCheckBox checkBox = new JCheckBox(resourceManager.getString("SplitPaneDemo.cont_layout"));
17126516Sbrian        checkBox.setSelected(true);
17226516Sbrian
1736059Samurai        checkBox.addChangeListener((ChangeEvent e) -> {
17426516Sbrian            splitPane.setContinuousLayout(
17531343Sbrian                    ((JCheckBox) e.getSource()).isSelected());
17631140Sbrian        });
17731121Sbrian        //</snip>
17811336Samurai
17911336Samurai        c.gridy++;
18026516Sbrian        addToGridbag(checkBox, 0, 1, 1, 1,
18126516Sbrian                GridBagConstraints.NONE, GridBagConstraints.WEST);
18231034Sbrian
18326516Sbrian        //<snip>Create checkbox to edit one-touch-expandable
18428679Sbrian        checkBox = new JCheckBox(ONE_TOUCH_EXPANDABLE);
18511336Samurai        checkBox.setSelected(true);
18611336Samurai
18726858Sbrian        checkBox.addChangeListener((ChangeEvent e) -> {
18830697Sbrian            splitPane.setOneTouchExpandable(
18931343Sbrian                    ((JCheckBox) e.getSource()).isSelected());
19011336Samurai        });
19111336Samurai        //</snip>
19226858Sbrian
19326858Sbrian        addToGridbag(checkBox, 0, 2, 1, 1,
19411336Samurai                GridBagConstraints.NONE, GridBagConstraints.WEST);
19526516Sbrian
19626516Sbrian        JSeparator separator = new JSeparator(JSeparator.VERTICAL);
1976059Samurai        addToGridbag(separator, 1, 0, 1, 3,
1986059Samurai                GridBagConstraints.VERTICAL, GridBagConstraints.CENTER);
19910528Samurai
20031343Sbrian        //<snip>Create spinner to edit divider size
20128536Sbrian        final JSpinner spinner = new JSpinner(
20231343Sbrian                new SpinnerNumberModel(splitPane.getDividerSize(), 5, 50, 2));
20331343Sbrian
20428536Sbrian        spinner.addChangeListener((ChangeEvent event) -> {
20531141Sbrian            SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel();
20631141Sbrian            splitPane.setDividerSize(model.getNumber().intValue());
20731343Sbrian        });
20828536Sbrian        //</snip>
20931141Sbrian
21031141Sbrian        JLabel label = new JLabel(DIVIDER_SIZE);
21128536Sbrian        label.setLabelFor(spinner);
21228536Sbrian        addToGridbag(label, 2, 0, 1, 1,
21328536Sbrian                GridBagConstraints.NONE, GridBagConstraints.EAST);
21428536Sbrian        addToGridbag(spinner, 3, 0, 1, 1,
21531343Sbrian                GridBagConstraints.NONE, GridBagConstraints.WEST);
21610528Samurai
21710528Samurai        //<snip>Create spinners to edit day & night's minimum sizes
21810528Samurai        JSpinner minSizeSpinner = new JSpinner(
21926516Sbrian                new SpinnerNumberModel(day.getMinimumSize().width, 0, 300, 10));
22031343Sbrian
22131343Sbrian        minSizeSpinner.addChangeListener(new MinimumSizeListener(day));
22220813Sjkh        //</snip>
22318856Ssos
22426911Sbrian        label = new JLabel(FIRST_COMPONENT_MIN_SIZE);
22526516Sbrian        label.setLabelFor(minSizeSpinner);
22626516Sbrian        addToGridbag(label, 2, 1, 1, 1,
22726516Sbrian                GridBagConstraints.NONE, GridBagConstraints.EAST);
22810528Samurai        addToGridbag(minSizeSpinner, 3, 1, 1, 1,
22926911Sbrian                GridBagConstraints.NONE, GridBagConstraints.WEST);
23026911Sbrian
23128679Sbrian        //<snip>Create spinners to edit day & night's minimum sizes
23226911Sbrian        minSizeSpinner = new JSpinner(
23328679Sbrian                new SpinnerNumberModel(night.getMinimumSize().width, 0, 300, 10));
23428679Sbrian
23526911Sbrian        minSizeSpinner.addChangeListener(new MinimumSizeListener(night));
23631121Sbrian        //</snip>
23728679Sbrian
23826516Sbrian        label = new JLabel(SECOND_COMPONENT_MIN_SIZE);
23926516Sbrian        label.setLabelFor(minSizeSpinner);
24026516Sbrian        addToGridbag(label, 2, 2, 1, 1,
24126516Sbrian                GridBagConstraints.NONE, GridBagConstraints.EAST);
24231343Sbrian        addToGridbag(minSizeSpinner, 3, 2, 1, 1,
24328381Sbrian                GridBagConstraints.NONE, GridBagConstraints.WEST);
24431121Sbrian
24531121Sbrian        return controlPanel;
24631121Sbrian    }
24731121Sbrian
24831121Sbrian    protected void addToGridbag(JComponent child, int gx, int gy,
24931121Sbrian            int gwidth, int gheight, int fill, int anchor) {
25028381Sbrian        c.insets = insets;
25128381Sbrian        c.gridx = gx;
25228381Sbrian        c.gridy = gy;
25328679Sbrian        c.gridwidth = gwidth;
25428381Sbrian        c.gridheight = gheight;
25528381Sbrian        c.fill = fill;
25628679Sbrian        c.anchor = anchor;
25726516Sbrian        gridbag.addLayoutComponent(child, c);
25826516Sbrian        controlPanel.add(child);
25928679Sbrian
26028679Sbrian    }
26118531Sbde
26228679Sbrian    //<snip>Create radio box to edit splitpane orientation
26328679Sbrian    private class OrientationListener implements ActionListener {
26428679Sbrian
26528679Sbrian        @Override
26628679Sbrian        public void actionPerformed(ActionEvent event) {
26728679Sbrian            splitPane.setOrientation(event.getActionCommand().equals("vertical")
26828679Sbrian                    ? JSplitPane.VERTICAL_SPLIT : JSplitPane.HORIZONTAL_SPLIT);
26928679Sbrian        }
27026516Sbrian
27128679Sbrian    }
27228679Sbrian    //</snip>
27328679Sbrian
27428679Sbrian    //<snip>Create spinners to edit day & night's minimum sizes
27528679Sbrian    public class MinimumSizeListener implements ChangeListener {
27628679Sbrian
27728679Sbrian        private final JComponent component;
27828679Sbrian
27926516Sbrian        public MinimumSizeListener(JComponent c) {
28028679Sbrian            this.component = c;
28131343Sbrian        }
28226516Sbrian
28328679Sbrian        @Override
28431061Sbrian        public void stateChanged(ChangeEvent event) {
28531343Sbrian            JSpinner spinner = (JSpinner) event.getSource();
28628679Sbrian            SpinnerNumberModel model = (SpinnerNumberModel) spinner.getModel();
28731343Sbrian            int min = model.getNumber().intValue();
28831343Sbrian            component.setMinimumSize(new Dimension(min, min));
28931343Sbrian        }
29031343Sbrian    }
29131343Sbrian    //</snip>
29231343Sbrian}
29331343Sbrian