2011-03-24 4 views
0

Je suis en train d'obtenir ce le code et en cours d'exécution à partir du site officiel java mais je reçoisJava SplitPaneDemo ne fonctionne pas?

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

En outre, à la ligne suivante, la méthode n'existe même pas. J'utilise getContentPane() à la place.

JSplitPane top = splitPaneDemo.getSplitPane(); 

Répondre

3

La démo fonctionne très bien. Il est votre modification (s) qui ne fonctionne pas :)

Ce fait travail:

/* 
* 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(); 
      } 
     }); 
    } 
} 

Vous pouvez coller le tout dans un fichier nommé SplitPaneDemo2.java et compiler et exécuter.

Source originale:

2

getContentPane() était une ancienne approche. Aujourd'hui, vous venez d'ajouter un panneau à l'image, où vous mettez vos affaires.

+0

Si oui ou non en utilisant 'getContentPane()' avant d'ajouter des composants ne causeraient pas une erreur 'StackOverflowError' bien. –

+0

C'est vrai. Vous aimeriez aussi voir plus de code? :) –

+0

Non, mon point est que bien que vous ayez raison, 'getContentPane()' n'est pas nécessaire, cela n'aide pas beaucoup en résolvant StackOverflowError. L'OP pourrait penser que vous voulez dire que 'getContentPane()' est à l'origine de StackOverflowError, ce qui n'est pas le cas. –