【问题标题】:IllegalStateException Error. While outlaying components with GroupLayout()IllegalStateException 错误。使用 GroupLayout() 布局组件时
【发布时间】:2014-03-26 18:54:33
【问题描述】:

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);


    }

}

【问题讨论】:

    标签: java user-interface illegalstateexception


    【解决方案1】:

    实际异常包含相关信息:

    java.lang.IllegalStateException: javax.swing.JTextField[...这里有很多垃圾...] 没有附加到垂直组

    你在打电话

    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。也许我只是不是“可视化 GUI 编辑器”的忠实粉丝,但我认为只有在确定没有人需要再次查看代码时才应该使用它们。 (这很少发生 - 得出你的结论......)

    【讨论】:

    • 这是对可视化编辑器的一个奇怪观察。另一种方法是手工编写整个 UI 的繁琐代码……真的吗?
    • @RobertHarvey 这可能取决于太多变量,无法在此处详细讨论(WHO 在 WHICH 程序中使用 WHICH 布局管理器来处理 WHICH GUI 等)。但是看看提问者的代码,我认为这基本上是不可维护的(问题本身至少是一个迹象)。我认为至少对如何手动布置 GUI 有一个idea 并没有什么坏处。当你必须创建几十个类似的、无聊的对话框时,这样的 UI 设计师肯定会节省时间,但是当你超出这个范围时,它们(即它们的代码)可能会很麻烦。 (有疑问,这只是一个意见......)
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2020-01-05
    相关资源
    最近更新 更多