【问题标题】:The alignment of Java Layout is messed upJava Layout 的对齐方式乱了
【发布时间】:2015-09-22 20:38:24
【问题描述】:

尝试在 Java Swing 和 AWT 中构建一个简单的注册表单,但无法完成我真正想要的。

这是我想要的结果

这是代码

import java.awt.*;
import javax.swing.*;


public class MainFrame {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    // Main Frame
    JFrame mainFrame = new JFrame("New Account Registration");

    JPanel borderPanel = new JPanel(new BorderLayout());
    JPanel gridPanel = new JPanel(new GridLayout(9,2));

    JPanel gridGenderPanel = new JPanel(new GridLayout(1,2));
    JPanel flowButton = new JPanel(new FlowLayout());

    //JLabels
    JLabel title = new JLabel("New Account Registration");
    JLabel name = new JLabel("Name");
    JLabel email = new JLabel("Email Address:");
    JLabel createPassword = new JLabel("Create Password:");
    JLabel confirmPassword = new JLabel("Confirm Password:");
    JLabel gender = new JLabel("Gender:");
    JLabel address = new JLabel("Address:");
    JLabel state = new JLabel("State:");
    JLabel country = new JLabel("Country:");
    JLabel phoneNo = new JLabel("Phone No:");


    String[] coutriesStrings = { "America", "Japan", "India", "Korea", "Sweden" };

    // JTextFields, JRadioButton, JComboBox
    JTextField nameField = new JTextField();
    JTextField emailField = new JTextField();
    JPasswordField passField = new JPasswordField();
    JPasswordField confirmPassField = new JPasswordField();
    JRadioButton male = new JRadioButton("Male");
    JRadioButton female = new JRadioButton("Female");
    ButtonGroup group = new ButtonGroup();
    group.add(male);
    group.add(female);
    JTextField addressField = new JTextField();
    JComboBox stateBox = new JComboBox(coutriesStrings);
    stateBox.setSelectedIndex(1);
    JTextField countryField = new JTextField();
    JTextField phoneField = new JTextField();

    JButton submitButton = new JButton("Submit");
    JButton clearButton = new JButton("Clear");


//      borderPanel.add(title, BorderLayout.NORTH);
//      gridPanel.add(title);

    // Name
    gridPanel.add(name);
    gridPanel.add(nameField);

    //Email
    gridPanel.add(email);
    gridPanel.add(emailField);

    // CreatePassword
    gridPanel.add(createPassword);
    gridPanel.add(passField);

    // Confirm Password
    gridPanel.add(confirmPassword);
    gridPanel.add(confirmPassField);

    // Gender
    gridGenderPanel.add(gender);
    gridGenderPanel.add(male);
    gridGenderPanel.add(female);
    gridPanel.add(gridGenderPanel);

    // Address
    gridPanel.add(address);
    gridPanel.add(addressField);

    // State
    gridPanel.add(state);
    gridPanel.add(stateBox);

    // Country
    gridPanel.add(country);
    gridPanel.add(countryField);

    //Button
    flowButton.add(submitButton);
    flowButton.add(clearButton);
    gridPanel.add(flowButton);

    mainFrame.add(gridPanel);   

    mainFrame.setSize(600, 700);
    mainFrame.setVisible(true);
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}

}

这是代码的结果

不知道哪里做错了,请指导一下。

【问题讨论】:

  • 我建议您使用Netbeans 进行布局设计,因为它通过拖放操作简单易用,您可以简单地设计布局。这不是一个解决方案,而是一个建议
  • 考虑在您的主框架上添加FlowLayout。没有它,您的 gridPanel 看起来就像整个框架。还有一些你甚至没有使用过的元素,比如phoneNo 标签。
  • 看来GridBagLayoutGroupLayout 更适合这种布局风格。 GridLayout 的问题在于(根据设计)它将以相同的宽度和高度显示网格的单元格。

标签: java swing awt layout-manager grid-layout


【解决方案1】:

您必须将gender 标签添加到gridPanel 而不是gridGenderPanel

    // Gender
    //gridGenderPanel.add(gender);//The mistake
    gridPanel.add(gender);//add to main panel 
    gridGenderPanel.add(male);
    gridGenderPanel.add(female);
    gridPanel.add(gridGenderPanel);

【讨论】:

    【解决方案2】:

    网格布局有一个坏习惯,就是让网格的每个部分都与网格的最大部分大小相同。制作要求所有内容都具有相同大小的 UI - 这非常有用。尝试使用 GridBagLayout - 它不是很漂亮,但它确实有效。

    public class MainFrame {
        public static void main(String[] args) {
        // TODO Auto-generated method stub
        // Main Frame
        JFrame mainFrame = new JFrame("New Account Registration");
    
        JPanel borderPanel = new JPanel(new BorderLayout());
        JPanel gridPanel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
    
        JPanel gridGenderPanel = new JPanel(new GridLayout(1, 2));
        JPanel flowButton = new JPanel(new FlowLayout());
    
        // JLabels
        JLabel title = new JLabel("New Account Registration");
        setSize(title);
        JLabel name = new JLabel("Name");
        setSize(name);
        JLabel email = new JLabel("Email Address:");
        setSize(email);
        JLabel createPassword = new JLabel("Create Password:");
        setSize(createPassword);
        JLabel confirmPassword = new JLabel("Confirm Password:");
        setSize(confirmPassword);
        JLabel gender = new JLabel("Gender:");
        setSize(gender);
        JLabel address = new JLabel("Address:");
        setSize(address);
        JLabel state = new JLabel("State:");
        setSize(state);
        JLabel country = new JLabel("Country:");
        setSize(country);
        JLabel phoneNo = new JLabel("Phone No:");
    
        String[] coutriesStrings = { "America", "Japan", "India", "Korea",
            "Sweden" };
    
        // JTextFields, JRadioButton, JComboBox
        JTextField nameField = new JTextField(15);
        JTextField emailField = new JTextField(15);
        JPasswordField passField = new JPasswordField(15);
        JPasswordField confirmPassField = new JPasswordField(15);
        JRadioButton male = new JRadioButton("Male");
        JRadioButton female = new JRadioButton("Female");
        ButtonGroup group = new ButtonGroup();
        group.add(male);
        group.add(female);
        JTextField addressField = new JTextField(15);
        JComboBox stateBox = new JComboBox(coutriesStrings);
        stateBox.setPreferredSize(new Dimension(200, 25));
        stateBox.setMinimumSize(new Dimension(200, 25));
        stateBox.setSelectedIndex(1);
        JTextField countryField = new JTextField(15);
        JTextField phoneField = new JTextField(15);
    
        JButton submitButton = new JButton("Submit");
        JButton clearButton = new JButton("Clear");
    
        // Name
        c.gridx = 0;
        c.gridy = 0;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(name, c);
        c.gridx = 2;
        c.gridy = 0;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(nameField, c);
    
        // Email
        c.gridx = 0;
        c.gridy = 1;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(email, c);
        c.gridx = 2;
        c.gridy = 1;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(emailField, c);
    
        // CreatePassword
        c.gridx = 0;
        c.gridy = 2;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(createPassword, c);
        c.gridx = 2;
        c.gridy = 2;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(passField, c);
    
        // Confirm Password
        c.gridx = 0;
        c.gridy = 3;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(confirmPassword, c);
        c.gridx = 2;
        c.gridy = 3;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(confirmPassField, c);
    
        // Gender
        c.gridx = 0;
        c.gridy = 4;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(gender,c );
        c.gridx = 2;
        c.gridy = 4;
        c.gridheight = 1;
        c.gridwidth = 1;
        gridPanel.add(male,c);
        c.gridx = 3;
        c.gridy = 4;
        c.gridheight = 1;
        c.gridwidth = 1;
        gridPanel.add(female,c);
    
        // Address
        c.gridx = 0;
        c.gridy = 5;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(address, c);
        c.gridx = 2;
        c.gridy = 5;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(addressField, c);
    
        // State
        c.gridx = 0;
        c.gridy = 6;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(state, c);
        c.gridx = 2;
        c.gridy = 6;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(stateBox, c);
    
        // Country
        c.gridx = 0;
        c.gridy = 7;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(country, c);
        c.gridx = 2;
        c.gridy = 7;
        c.gridheight = 1;
        c.gridwidth = 2;
        gridPanel.add(countryField, c);
    
        // Button
        flowButton.add(submitButton);
        flowButton.add(clearButton);
        c.gridx = 1;
        c.gridy = 8;
        c.gridheight = 1;
        c.gridwidth = 4;
        gridPanel.add(flowButton, c);
    
        mainFrame.add(gridPanel);
    
        mainFrame.setSize(350, 300);
        mainFrame.setVisible(true);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        }
    
        private static void setSize(Component label) {
        label.setMinimumSize(new Dimension(120, 15));
        label.setPreferredSize(new Dimension(120, 15));
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2016-06-08
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多