Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用组布局时出错_Java_Swing_Layout Manager_Grouplayout - Fatal编程技术网

Java 使用组布局时出错

Java 使用组布局时出错,java,swing,layout-manager,grouplayout,Java,Swing,Layout Manager,Grouplayout,代码:为描述的名称和文本字段添加名称和描述组合框 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.swin

代码:为描述的名称和文本字段添加名称和描述组合框

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

}

关于代码的几点提示:

不要把框架的内容窗格设置成一个明确的JPanel:setContentPanecontentPane。将此面板添加到内容窗格:addcontentPane。这样,您可以利用框架的默认布局管理器:

把布局经理和挫折混在一起不是个好主意。。。。仅在将组件添加到其内容窗格之后和使其可见之前显示框架

虽然您可以完美地使用手工编写GUI,但它是为GUI构建者而设计的。看看答案。在拐角处有更好的选择

如果您不想使用任何第三方布局管理器,那么这也是一个不错的选择

关于此例外情况:

java.lang.IllegalStateException: javax.swing.JTextField[...] is not attached to a horizontal group
很难说问题出在哪里,因为创建的组太多了。由于某些原因,布局管理器无法解析此文本字段descfield所附加到的水平组。预期布局的图片可能有助于跟踪问题所在

使现代化 在最小化remove arrays迭代并测试代码后,问题是您创建了几个组,但从未将水平或垂直组设置为group1,从而导致IllegalStateException。要解决此问题,只需将两个组设置为:

    group1.setHorizontalGroup(hseq1);
    group1.setVerticalGroup(vseq1);
这是我用来解决这个问题的固定代码。请注意变量的名称:它们必须有意义

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();
            }
        });
    }
}
截图
关于代码的几点提示:

不要把框架的内容窗格设置成一个明确的JPanel:setContentPanecontentPane。将此面板添加到内容窗格:addcontentPane。这样,您可以利用框架的默认布局管理器:

把布局经理和挫折混在一起不是个好主意。。。。仅在将组件添加到其内容窗格之后和使其可见之前显示框架

虽然您可以完美地使用手工编写GUI,但它是为GUI构建者而设计的。看看答案。在拐角处有更好的选择

如果您不想使用任何第三方布局管理器,那么这也是一个不错的选择

关于此例外情况:

java.lang.IllegalStateException: javax.swing.JTextField[...] is not attached to a horizontal group
很难说问题出在哪里,因为创建的组太多了。由于某些原因,布局管理器无法解析此文本字段descfield所附加到的水平组。预期布局的图片可能有助于跟踪问题所在

使现代化 在最小化remove arrays迭代并测试代码后,问题是您创建了几个组,但从未将水平或垂直组设置为group1,从而导致IllegalStateException。要解决此问题,只需将两个组设置为:

    group1.setHorizontalGroup(hseq1);
    group1.setVerticalGroup(vseq1);
这是我用来解决这个问题的固定代码。请注意变量的名称:它们必须有意义

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();
            }
        });
    }
}
截图
谢谢@dic19。我只有两个jlabel:Name和Desc,这两个JcomboBox和JTextField分别对应。关于组,我只是将其分组为水平,前两个用于循环,最后一个用于循环。欢迎使用@雇佣军。请看我的更新。必须将水平组和垂直组都设置为group1布局。不过,我强烈建议您使用另一个布局管理器。谢谢!我重新设计了我写它的方式,它工作!是的,我觉得这是因为没有把他们加入这个群体。谢谢@dic19。我只有两个jlabel:Name和Desc,这两个JcomboBox和JTextField分别对应。关于组,我只是将其分组为水平,前两个用于循环,最后一个用于循环。欢迎使用@雇佣军。请看我的更新。必须将水平组和垂直组都设置为group1布局。不过,我强烈建议您使用另一个布局管理器。谢谢!我重新设计了我写它的方式,它工作!是的,我觉得这是因为没有把他们加入团队。