Создание нового кадра и оформление его с помощью SpringLayout с использованием SpringUtilities
В настоящее время я делаю небольшое приложение, для которого мне нужен класс Spring Utilities, этот класс расширяет JPanel, потому что это панель содержимого, однако мне нужно получить тип макета через контейнер, но только этот класс / фрейм использует весенний макет, который возвращает исключение EventQueue (class = https://docs.oracle.com/javase/tutorial/uiswing/examples/layout/SpringGridProject/src/layout/SpringUtilities.java) Ошибка:
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)
Я думаю, что это связано с этим
SpringUtilities.makeCompactGrid(this, 3, 2, 6, 6, 6, 6);
Потому что "это" не может быть использовано, но я не уверен, что использовать тогда.
Код:
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);
}
}
Любая помощь будет отличной, и спасибо заранее.
1 ответ
Сначала вам нужно добавить компоненты в контейнер. Тогда подать заявку SpringUtilities.makeCompactGrid()
метод, как он пытается расположить существующие компоненты. Так что просто двигайся makeCompactGrid()
до конца Addnew()
конструктор в конце концов add()
были выполнены.
В качестве примечания, хотя SpringLayout очень гибок, он также очень низок и обычно используется сборками графического интерфейса и может быть громоздким для написания кода вручную. Смотрите Как использовать SpringLayout для более подробной информации:
SpringLayout - очень гибкий менеджер макетов, который может эмулировать многие функции других менеджеров макетов. SpringLayout, однако, очень низкоуровневый, и поэтому вам действительно следует использовать его только с GUI-компоновщиком, а не пытаться кодировать менеджер компоновки Spring вручную.