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布局。不过,我强烈建议您使用另一个布局管理器。谢谢!我重新设计了我写它的方式,它工作!是的,我觉得这是因为没有把他们加入团队。