IllegalStateException错误。使用GroupLayout()来排除组件

时间:2014-03-26 18:54:33

标签: java user-interface illegalstateexception

java中的GUI新手,我正在尝试使用GroupLayouts来布局图形组件,我做错了什么,但没有想法。我无法找到导致此错误的原因。迫切需要帮助。

线程中的异常" main"线程中的异常" AWT-EventQueue-0" java.lang.IllegalStateException:

at javax.swing.GroupLayout.checkComponents(Unknown Source)
at javax.swing.GroupLayout.prepare(Unknown Source)
at javax.swing.GroupLayout.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.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 AlignTest.main(AlignTest.java:12)

java.lang.IllegalStateException:

这是代码:

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;enter code here
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class AlignFrame extends JFrame {


    private JTextField xTField;
    private JTextField yTField;

    private JLabel xLabel;
    private JLabel yLabel;

    private JCheckBox sToGr;
    private JCheckBox showGrid;

    private JButton okButton;
    private JButton cancelButton;
    private JButton helpButton;

    public AlignFrame()
    {
        super("Align");
        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);

        xLabel = new JLabel("X: ");
        yLabel = new JLabel("Y: ");

        xTField = new JTextField("");
        yTField = new JTextField("");

        sToGr= new JCheckBox("Snap to Grid");
        showGrid = new JCheckBox("Show Grid");

        okButton = new JButton("OK");
        cancelButton = new JButton("Cancel");
        helpButton = new JButton("Help");

        layout.setAutoCreateContainerGaps(true);
        layout.setAutoCreateGaps(true);

        layout.setHorizontalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addComponent(sToGr)
                        .addComponent(showGrid)
                        )
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                        .addComponent(xLabel)
                                        .addComponent(yLabel))
                                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                        .addComponent(xTField)
                                        .addComponent(yTField))
                                )
                        )
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addComponent(okButton)
                        .addComponent(cancelButton)
                        .addComponent(helpButton))
                );

        layout.setVerticalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addComponent(sToGr)
                        .addComponent(showGrid)
                        )
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addComponent(xLabel)
                        .addComponent(yLabel))
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)                     
                        .addComponent(okButton)
                        .addComponent(cancelButton)
                        .addComponent(helpButton))

                );
    }

}


####################################################################
############### AlignTest class that contains main #################
####################################################################

import javax.swing.JFrame;


public class AlignTest {

    public static void main(String [] args)
    {
        AlignFrame test = new AlignFrame();

        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setSize(500, 500);
        test.setVisible(true);


    }

}

1 个答案:

答案 0 :(得分:2)

实际例外包含相关信息:

  

java.lang.IllegalStateException:javax.swing.JTextField [ ... lota garbage here ... ]未附加到垂直组

您正在致电

layout.setHorizontalGroup(...)

layout.setVerticalGroup(...)

但在后者中,JTextFields(xTFieldyTField)没有出现。虽然可以通过插入这些线来“修复”......

...
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
    .addComponent(xLabel)
    .addComponent(yLabel)
    .addComponent(xTField) // <---
    .addComponent(yTField) // <---
)

在纵向群组中,我强烈建议您查看http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html。也许我不是“Visual GUI编辑器”的忠实粉丝,但我认为只有当你可以确定没有人必须再次查看代码时,你才应该使用它们。 (这很少发生 - 得出你的结论......)