Reputation: 2166
Code: Adding name and description (Combo box for name and text field for desc)
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.BoxLayout;
public class Sample extends JFrame {
private JPanel contentPane;
private JTextField textField;
private JTextField textField_1;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Sample frame = new Sample();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Sample() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.CENTER);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JPanel panel_1 = new JPanel();
panel.add(panel_1);
GroupLayout group1 = new GroupLayout(panel_1);
panel_1.setLayout(group1);
group1.setAutoCreateGaps(true);
GroupLayout.SequentialGroup hseq1 = group1.createSequentialGroup();
GroupLayout.Group hg1 = group1.createParallelGroup(Alignment.TRAILING);
GroupLayout.Group hg2 = group1.createParallelGroup();
hseq1.addGroup(hg1);
hseq1.addGroup(hg2);
GroupLayout.SequentialGroup vseq1 = group1.createSequentialGroup();
ArrayList<JLabel> labels = new ArrayList<>();
ArrayList fields = new ArrayList();
JLabel labelC = new JLabel("Name : ");
labels.add(labelC);
JComboBox<String> box = new JComboBox<>();
fields.add(box);
JLabel desc = new JLabel("Desc : ");
labels.add(desc);
JTextField descfield = new JTextField(20);
fields.add(descfield);
//Adding to the group
for(int i=0; i<labels.size(); i++){
hg1.addComponent(labels.get(i));
}
for(int i=0; i<fields.size(); i++){
if(i==0){
hg2.addComponent((JComboBox)fields.get(i));
}
else{
hg2.addComponent((JTextField)fields.get(i));
}
}
for(int i=0; i<labels.size(); i++){
if(i==0){
vseq1.addGroup(group1.createParallelGroup().addComponent(labels.get(i)).addComponent((JComboBox)fields.get(i)));
}
else{
vseq1.addGroup(group1.createParallelGroup().addComponent(labels.get(i)).addComponent((JTextField)fields.get(i)));
}
}
}
}
Exception :
java.lang.IllegalStateException: javax.swing.JTextField[,0,0,0x0,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@46faf015,flags=296,maximumSize=,minimumSize=,preferredSize=,caretColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],disabledTextColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],editable=true,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],selectionColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],columns=20,columnWidth=0,command=,horizontalAlignment=LEADING] is not attached to a horizontal group
at javax.swing.GroupLayout.checkComponents(Unknown Source)
at javax.swing.GroupLayout.prepare(Unknown Source)
at javax.swing.GroupLayout.minimumLayoutSize(Unknown Source)
at java.awt.Container.minimumSize(Unknown Source)
at java.awt.Container.getMinimumSize(Unknown Source)
at javax.swing.JComponent.getMinimumSize(Unknown Source)
at javax.swing.BoxLayout.checkRequests(Unknown Source)
at javax.swing.BoxLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at java.awt.Container.validateUnconditionally(Unknown Source)
at java.awt.Window.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at main.Sample$1.run(Sample.java:34)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(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$1.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)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.SizeRequirements.calculateAlignedPositions(Unknown Source)
at javax.swing.BoxLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(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$200(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$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.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$1.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)
Upvotes: 1
Views: 3556
Reputation: 17971
Just few hints about your code:
Don't mess with frame's content pane setting a JPanel
explicitely: setContentPane(contentPane)
. Add this panel to the content pane instead: add(contentPane)
. This way you can take advantage of the frame's default layout manager: BorderLayout
It's not a good idea mixing up layout managers with setBounds(...)
. Just pack() the frame after adding components to its content pane and before making it visible.
While you can perfectly use GroupLayout to hand-write your GUI it is designed to be used by GUI builders. See the answer to this question. There are better options around the corner.
If you don't want to use any third-party layout manager, then Nested Layout approach is a good option as well.
About this exception:
java.lang.IllegalStateException: javax.swing.JTextField[...] is not attached to a horizontal group
It is really hard to tell where the problem is because there are too many groups created. For some reason the layout manager can't resolve the horizontal group this text field (descfield
I guess) is attached to. A picture of the expected layout might be helpful to trace where the problem lies.
After minimize (remove arrays iteration) and test your code, the problem is you create several groups but you never set the horizontal nor vertical group to group1
, causing the IllegalStateException
. To solve this issue you just need to set both groups like this:
group1.setHorizontalGroup(hseq1);
group1.setVerticalGroup(vseq1);
Here is the fixed code I've used to solve the problem. Please note the names of the variables: they must be meaningful.
import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Demo {
private void createAndShowGUI() {
JPanel groupLayoutPanel = new JPanel();
GroupLayout groupLayout = new GroupLayout(groupLayoutPanel);
groupLayout.setAutoCreateGaps(true);
groupLayoutPanel.setLayout(groupLayout);
GroupLayout.Group hg1 = groupLayout.createParallelGroup(Alignment.TRAILING);
GroupLayout.Group hg2 = groupLayout.createParallelGroup();
GroupLayout.Group vg1 = groupLayout.createParallelGroup();
GroupLayout.Group vg2 = groupLayout.createParallelGroup();
JLabel nameLabel = new JLabel("Name : ");
hg1.addComponent(nameLabel);
vg1.addComponent(nameLabel);
JComboBox<String> nameComboBox = new JComboBox<>();
hg2.addComponent(nameComboBox);
vg1.addComponent(nameComboBox);
JLabel descriptionLabel = new JLabel("Desc : ");
hg1.addComponent(descriptionLabel);
vg2.addComponent(descriptionLabel);
JTextField descriptionTextField = new JTextField(20);
hg2.addComponent(descriptionTextField);
vg2.addComponent(descriptionTextField);
// Horizontal group
GroupLayout.SequentialGroup hseq1 = groupLayout.createSequentialGroup();
hseq1.addGroup(hg1);
hseq1.addGroup(hg2);
// Vertical group
GroupLayout.SequentialGroup vseq1 = groupLayout.createSequentialGroup();
vseq1.addGroup(vg1);
vseq1.addGroup(vg2);
groupLayout.setHorizontalGroup(hseq1);
groupLayout.setVerticalGroup(vseq1);
JPanel contentPane = new JPanel(new BorderLayout(4, 4));
contentPane.setBorder(BorderFactory.createEmptyBorder(8,8,8,8));
contentPane.add(groupLayoutPanel);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().createAndShowGUI();
}
});
}
}
Upvotes: 5