Search code examples
javajsplitpane

Java SplitPaneDemo not working?


I am trying to get this up code up and running from java official site but I am getting

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
    at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source)
    at java.awt.Window.init(Unknown Source)
    at java.awt.Window.<init>(Unknown Source)
    at java.awt.Frame.<init>(Unknown Source)
    at javax.swing.JFrame.<init>(Unknown Source)

http://download.oracle.com/javase/tutorial/uiswing/examples/components/SplitPaneDemo2Project/src/components/SplitPaneDemo2.java

Also, at the following line, the method doesn't even exist. I am using getContentPane() instead.

 JSplitPane top = splitPaneDemo.getSplitPane();

Solution

  • The demo works just fine. It's your modification(s) that don't work :)

    This does work:

    /*
     * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *   - Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     *   - Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *
     *   - Neither the name of Oracle or the names of its
     *     contributors may be used to endorse or promote products derived
     *     from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */ 
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class SplitPaneDemo2 extends JFrame
            implements ListSelectionListener {
    
        private JLabel label;
    
        public SplitPaneDemo2() {
            super("SplitPaneDemo2");
    
            //Create an instance of SplitPaneDemo
            SplitPaneDemo splitPaneDemo = new SplitPaneDemo();
            JSplitPane top = splitPaneDemo.getSplitPane();
            splitPaneDemo.getImageList().addListSelectionListener(this);
    
            //XXXX: Bug #4131528, borders on nested split panes accumulate.
            //Workaround: Set the border on any split pane within
            //another split pane to null. Components within nested split
            //panes need to have their own border for this to work well.
            top.setBorder(null);
    
            //Create a regular old label
            label = new JLabel("Click on an image name in the list.",
                    JLabel.CENTER);
    
            //Create a split pane and put "top" (a split pane)
            //and JLabel instance in it.
            JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
                    top, label);
            splitPane.setOneTouchExpandable(true);
            splitPane.setDividerLocation(180);
    
            //Provide minimum sizes for the two components in the split pane
            top.setMinimumSize(new Dimension(100, 50));
            label.setMinimumSize(new Dimension(100, 30));
    
            //Add the split pane to this frame
            getContentPane().add(splitPane);
        }
    
        public void valueChanged(ListSelectionEvent e) {
            if (e.getValueIsAdjusting())
                return;
    
            JList theList = (JList) e.getSource();
            if (theList.isSelectionEmpty()) {
                label.setText("Nothing selected.");
            } else {
                int index = theList.getSelectedIndex();
                label.setText("Selected image number " + index);
            }
        }
    
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new SplitPaneDemo2();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    
    class SplitPaneDemo extends JPanel
            implements ListSelectionListener {
        private JLabel picture;
        private JList list;
        private JSplitPane splitPane;
        private String[] imageNames = {"Bird", "Cat", "Dog", "Rabbit", "Pig", "dukeWaveRed",
                "kathyCosmo", "lainesTongue", "left", "middle", "right", "stickerface"};
    
        public SplitPaneDemo() {
    
            //Create the list of images and put it in a scroll pane.
    
            list = new JList(imageNames);
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setSelectedIndex(0);
            list.addListSelectionListener(this);
    
    
            JScrollPane listScrollPane = new JScrollPane(list);
            picture = new JLabel();
            picture.setFont(picture.getFont().deriveFont(Font.ITALIC));
            picture.setHorizontalAlignment(JLabel.CENTER);
    
            JScrollPane pictureScrollPane = new JScrollPane(picture);
    
            //Create a split pane with the two scroll panes in it.
            splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                    listScrollPane, pictureScrollPane);
            splitPane.setOneTouchExpandable(true);
            splitPane.setDividerLocation(150);
    
            //Provide minimum sizes for the two components in the split pane.
            Dimension minimumSize = new Dimension(100, 50);
            listScrollPane.setMinimumSize(minimumSize);
            pictureScrollPane.setMinimumSize(minimumSize);
    
            //Provide a preferred size for the split pane.
            splitPane.setPreferredSize(new Dimension(400, 200));
            updateLabel(imageNames[list.getSelectedIndex()]);
        }
    
        //Listens to the list
        public void valueChanged(ListSelectionEvent e) {
            JList list = (JList) e.getSource();
            updateLabel(imageNames[list.getSelectedIndex()]);
        }
    
        //Renders the selected image
        protected void updateLabel(String name) {
            ImageIcon icon = createImageIcon("images/" + name + ".gif");
            picture.setIcon(icon);
            if (icon != null) {
                picture.setText(null);
            } else {
                picture.setText("Image not found");
            }
        }
    
        //Used by SplitPaneDemo2
        public JList getImageList() {
            return list;
        }
    
        public JSplitPane getSplitPane() {
            return splitPane;
        }
    
    
        /**
         * Returns an ImageIcon, or null if the path was invalid.
         */
        protected static ImageIcon createImageIcon(String path) {
            java.net.URL imgURL = SplitPaneDemo.class.getResource(path);
            if (imgURL != null) {
                return new ImageIcon(imgURL);
            } else {
                System.err.println("Couldn't find file: " + path);
                return null;
            }
        }
    
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
    
            //Create and set up the window.
            JFrame frame = new JFrame("SplitPaneDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            SplitPaneDemo splitPaneDemo = new SplitPaneDemo();
            frame.getContentPane().add(splitPaneDemo.getSplitPane());
    
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    

    You can stick it all in a file named SplitPaneDemo2.java and compile and run it.

    Original source: