Как установить макет в java GUI качели? - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь создать форму регистрации для своего приложения (школьный проект), я хотел установить макет на BoxLayout, но у поля Jtextfields и поля со списком есть проблема, как вы можете видеть ниже, связана ли эта проблема на setSize() или это я что-то делаю неправильно, я просто хочу сортировки Jtextfields по вертикали, я ценю поддержку enter image description here

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;

}

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Поля ввода огромные

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 для изменения размера любого компонента.

0 голосов
/ 04 мая 2020
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;

}

Я исправил проблему, создав панель для каждого входа и метки

...