2016-08-04 27 views
0

Ich mache gerade eine kleine Anwendung, für die ich die Spring Utilities-Klasse benötige, diese Klasse erweitert 'JPanel', weil es ein Inhaltsfenster ist, aber ich muss das bekommen Art des Layouts durch einen Behälter, aber nur diese Klasse/Rahmen wird unter Verwendung der Federanordnung, die eine Eventqueue Exception (class = https://docs.oracle.com/javase/tutorial/uiswing/examples/layout/SpringGridProject/src/layout/SpringUtilities.java) liefert die Fehler:Einen neuen Rahmen erstellen und mit SpringLayout mit SpringUtilities dekorieren

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 0 
at java.awt.Container.getComponent(Unknown Source) 
at dinges.Utilities.SpringUtilities.getConstraintsForCell(SpringUtilities.java:153) 
at dinges.Utilities.SpringUtilities.makeCompactGrid(SpringUtilities.java:190) 
at dinges.Containers.Addnew.<init>(Addnew.java:38) 
at dinges.Containers.Listeners.AddListener.mousePressed(AddListener.java:27) 
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

ich glaube, dass es auf diesen

gebührt
SpringUtilities.makeCompactGrid(this, 3, 2, 6, 6, 6, 6); 

Weil 'dies' nicht verwendet werden kann, aber ich unsicher bin, was ich dann verwenden soll.

Code:

package dinges.Containers; 

import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SpringLayout; 

import dinges.Utilities.SpringUtilities; 

@SuppressWarnings("serial") 
public class Addnew extends JPanel { 

    /** 
    * > Add a text input for the following: 
    * > Id, Name, last name, current balance, and the state. But this has to be in order of the new Account. 
    * > we're just going to be using JTextFields, a JButton for saving and JLabels for writing what it is 
    * 
    **/ 

    public Addnew() { 
     // frame size is WIDTH = 280  ,  HEIGHT =  480 
     SpringLayout layout = new SpringLayout(); 
     setLayout(layout); 

     JButton save = new JButton("Save data"); 
     JTextField name = new JTextField(15); 
     JTextField lastname = new JTextField(15); 
     JComboBox<String> accounttype = new JComboBox<String>(); 
     JLabel label1 = new JLabel("First name: ", JLabel.TRAILING); 
     JLabel label2 = new JLabel("Last name: ", JLabel.TRAILING); 
     JLabel label3 = new JLabel("Account type: ", JLabel.TRAILING); 
     label1.setLabelFor(name); 
     label2.setLabelFor(lastname); 
     label3.setLabelFor(accounttype); 

     SpringUtilities.makeCompactGrid(this, 3, 2, 6, 6, 6, 6); 




     add(label1); 
     add(label2); 
     add(label3); 
     add(save); 
     add(name); 
     add(lastname); 
     add(accounttype); 
    } 

} 

Jede Hilfe wäre toll, und Dank im Voraus.

Antwort

1

Sie müssen dem Container zuerst Komponenten hinzufügen. Wenden Sie dann die Methode SpringUtilities.makeCompactGrid() an, wenn Sie versuchen, vorhandene Komponenten zu planen. Also verschieben Sie einfach bis zum Ende Addnew() Konstruktor, nachdem alle add() ausgeführt wurden.

Als eine Randnotiz, obwohl SpringLayout sehr flexibel ist, ist es auch sehr niedrige Ebene, und normalerweise von GUI-Builds verwendet, und kann mühsam sein, von Hand zu codieren. Weitere Details siehe How to Use SpringLayout:

SpringLayout is a very flexible layout manager that can emulate many of the features of other layout managers. SpringLayout is, however, very low-level and as such you really should only use it with a GUI builder, rather than attempting to code a spring layout manager by hand.