繁体   English   中英

如何在 java GUI swing 中设置布局?

[英]How to set layout in java GUI swing?

我正在尝试为我的应用程序(学校项目)创建一个注册表单,我想将布局设置为BoxLayout ,但Jtextfields和组合框出现问题,如下所示,这个问题与setSize()是否有关?我做错了,我只希望Jtextfields垂直排序,感谢支持在此处输入图像描述

private JPanel SetUpRegister() {
        JLabel registerLabel = new JLabel("Registera");

        registerLabel.setFont(new Font("Arial", Font.BOLD, 30));
        loginRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
        passwordRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
        fnRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
        lnRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
        ageRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
        String[] genderlist = new String[] { "Male", "Female", "Other" };
        JComboBox<String> registerList = new JComboBox<>(genderlist);

        JPanel registerPanel = new JPanel();    
        registerPanel.setBackground(new Color(255, 140, 0));
        registerPanel.add(registerLabel);
        registerPanel.add(loginRegisterInput);
        registerPanel.add(passwordRegisterInput);
        registerPanel.add(fnRegisterInput);
        registerPanel.add(lnRegisterInput);
        registerPanel.add(ageRegisterInput);
        registerPanel.add(registerList);
        registerPanel.setLayout(new BoxLayout(registerPanel,BoxLayout.Y_AXIS));

        return registerPanel;

}

输入字段很大

当面板上有额外空间可用时, BoxLayout将尝试调整组件的大小。 它会将组件的大小调整为最大大小。

由于某种原因, JTextField的最大高度是Integer.MAX_VALUE这对我来说没有意义,因为当您输入更多文本时,文本的高度永远不会改变。

无论如何,您有几个选择:

  1. 使用不同的布局管理器,例如GridBagLayout GridBagLayout将尊重文本字段的首选大小。
  2. 创建自定义JTestField并覆盖getMaximumSize()方法以返回组件的首选高度
  3. 使用包装面板。

对于包装面板,您可以执行以下操作:

JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(registerPanel, BorderLayout.PAGE_START);
return wrapper;
//return registerPanel;

BorderLayout 将尊重添加到 PAGE_START 的任何组件的首选高度,因此不需要 BoxLayout 调整任何组件的大小。

private JPanel SetUpRegister() {
    JLabel registerLabel = new JLabel("Registera");
    JLabel registerLabel1 = new JLabel("Login :");
    JLabel registerLabel2 = new JLabel("Password :");
    JLabel registerLabel3 = new JLabel("First Name :");
    JLabel registerLabel4 = new JLabel("Last Name :");
    JLabel registerLabel5 = new JLabel("Age :");
    JLabel registerLabel6 = new JLabel("Gender :");
    JLabel registerLabel7 = new JLabel("Bio :");
    registerLabel.setFont(new Font("Arial", Font.BOLD, 30));
    JButton createAccButton = new JButton("Create");
    createAccButton.addActionListener(new CreateAccountListener());
    loginRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
    passwordRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
    fnRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
    lnRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
    ageRegisterInput = new JTextField(INPUT_FIELD_WIDTH);
    bioRegisterInput = new JTextField(INPUT_FIELD_WIDTH);

    String[] genderlist = new String[] { "Male", "Female", "Other" };
    registerList = new JComboBox(genderlist);
    JPanel registerPanel = new JPanel();
    registerPanel.setLayout(new BoxLayout(registerPanel, BoxLayout.Y_AXIS));
    registerPanel.add(registerLabel);

    JPanel registerLabPanel = new JPanel();
    registerLabPanel.setLayout(new FlowLayout());
    registerLabPanel.add(registerLabel);

    JPanel usernamePanel = new JPanel();
    usernamePanel.setLayout(new FlowLayout());
    usernamePanel.add(registerLabel1);
    usernamePanel.add(loginRegisterInput);

    JPanel passwordPanel = new JPanel();
    passwordPanel.setLayout(new FlowLayout());
    passwordPanel.add(registerLabel2);
    passwordPanel.add(passwordRegisterInput);

    JPanel fnPanel = new JPanel();
    fnPanel.setLayout(new FlowLayout());
    fnPanel.add(registerLabel3);
    fnPanel.add(fnRegisterInput);

    JPanel lnPanel = new JPanel();
    lnPanel.setLayout(new FlowLayout());
    lnPanel.add(registerLabel4);
    lnPanel.add(lnRegisterInput);

    JPanel agePanel = new JPanel();
    agePanel.setLayout(new FlowLayout());
    agePanel.add(registerLabel5);
    agePanel.add(ageRegisterInput);

    JPanel genderPanel = new JPanel();
    genderPanel.setLayout(new FlowLayout());
    genderPanel.add(registerLabel6);
    genderPanel.add(registerList);

    JPanel bioPanel = new JPanel();
    bioPanel.setLayout(new FlowLayout());
    bioPanel.add(registerLabel7);
    bioPanel.add(bioRegisterInput);

    JPanel buttonLoginPanel = new JPanel();
    buttonLoginPanel.setLayout(new FlowLayout());
    buttonLoginPanel.add(createAccButton);

    registerPanel.add(registerLabel);
    registerPanel.add(usernamePanel);
    registerPanel.add(passwordPanel);
    registerPanel.add(fnPanel);
    registerPanel.add(lnPanel);
    registerPanel.add(agePanel);
    registerPanel.add(genderPanel);
    registerPanel.add(bioPanel);
    registerPanel.add(buttonLoginPanel);

    return registerPanel;

}

我通过为每个输入和 label 制作面板解决了这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM