FlowLayout Центрирует метку?

Я делаю форму, используя FlowLayout. Графический интерфейс формы показан ниже:

Name: <textField>
    Age: <textfiedl>
    Gender: Male[] Female[]
Email: <textField>

Для пола варианты — это переключатели. Как видите, метки для возраста и пола должны располагаться по центру. Как я могу сделать это, используя FlowLayout?


person user10600161    schedule 07.06.2020    source источник


Ответы (2)


Это один из способов (из множества способов, которыми это можно сделать). Детали макета в озаглавленных границах.

введите здесь описание изображения

Примечание. Для всего, что связано с выбором числа, лучше предложить пользователю счетчик.

person Andrew Thompson    schedule 07.06.2020
comment
Хорошо сделано. 1+. Оригинальный плакат: это лучшее и более полное решение - person DontKnowMuchBut Getting Better; 07.06.2020
comment
@DontKnowMuchButGettingBetter Ваши предложения тоже были хороши. Я бы выбрал GridBagLayout, так как мне не нужно было думать, как заставить BoxLayout работать в соответствии с моими потребностями, а с GBL все это можно было бы достичь с помощью одной панели. - person Andrew Thompson; 07.06.2020

Если вся форма создана с использованием BoxLayout, ориентированного как BoxLayout.PAGE_AXIS, то если каждая «строка» формы представляет собой JPanel, использующий FlowLayout, компоненты, которые они содержат, должны быть центрированы по умолчанию, поскольку JPanel использует new FlowLayout(FlowLayout.CENTER, 5, 5) в качестве макета по умолчанию ( на самом деле он использует new FlowLayout(), но значения по умолчанию для этого конструктора такие же, как указано выше - ориентация по ЦЕНТРУ с горизонтальными и вертикальными промежутками 5).

Другой вариант — использовать GridBagLayout и изменить свойства FILL и weighty ограничений для компонента в каждой строке.

Например:

введите здесь описание изображения

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

public class LayoutExample extends JPanel {
    private static final long serialVersionUID = 1L;
    private JTextField ageField = new JTextField(10);
    private JTextField emailField = new JTextField(10);
    private ButtonGroup sexBtnGroup = new ButtonGroup();
    private JRadioButton maleBtn = new JRadioButton("Male");
    private JRadioButton femaleBtn = new JRadioButton("Female");

    public LayoutExample() {
        JPanel agePanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5));
        agePanel.add(new JLabel("Age:"));
        agePanel.add(ageField);

        sexBtnGroup.add(maleBtn);
        sexBtnGroup.add(femaleBtn);;
        JPanel sexSelectionPanel = new JPanel();
        sexSelectionPanel.add(new JLabel("Select Sex:"));
        sexSelectionPanel.add(maleBtn);
        sexSelectionPanel.add(femaleBtn);

        JPanel emailPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5));
        emailPanel.add(new JLabel("Email:"));
        emailPanel.add(emailField);

        int gap = 10;
        setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
        add(agePanel);
        add(Box.createVerticalStrut(5));
        add(sexSelectionPanel);
        add(Box.createVerticalStrut(5));
        add(emailPanel);        
    }

    // make it stretch horizontally to see placement
    @Override
    public Dimension getPreferredSize() {
        Dimension superSize = super.getPreferredSize();
        int width = (3 * superSize.width) / 2;
        int height = superSize.height;
        return new Dimension(width, height);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        LayoutExample mainPanel = new LayoutExample();
        JFrame frame = new JFrame("LayoutExample");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}

Пример 2 с использованием GridBagLayout:

введите здесь описание изображения

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.*;

public class LayoutExample2 extends JPanel {
    private static final long serialVersionUID = 1L;
    private JTextField ageField = new JTextField(10);
    private JTextField emailField = new JTextField(10);
    private ButtonGroup sexBtnGroup = new ButtonGroup();
    private JRadioButton maleBtn = new JRadioButton("Male");
    private JRadioButton femaleBtn = new JRadioButton("Female");

    public LayoutExample2() {

        JPanel sexSelectPanel = new JPanel(new GridLayout(1, 0, 5, 5));
        sexBtnGroup.add(maleBtn);
        sexSelectPanel.add(maleBtn);
        sexBtnGroup.add(femaleBtn);
        sexSelectPanel.add(femaleBtn);

        int gap = 10;
        setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        setLayout(new GridBagLayout());

        add(new JLabel("Age:"), createGbc(0, 0));
        add(ageField, createGbc(1, 0));

        add(new JLabel("Sex:"), createGbc(0, 1));
        add(sexSelectPanel, createGbc(1, 1));

        add(new JLabel("Email:"), createGbc(0, 2));
        add(emailField, createGbc(1, 2));
    }

    private static GridBagConstraints createGbc(int x, int y) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        int ins = 4;
        gbc.insets = new Insets(ins, ins, ins, ins);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        return gbc;
    }

    // make it stretch horizontally to see placement
    @Override
    public Dimension getPreferredSize() {
        Dimension superSize = super.getPreferredSize();
        int width = (4 * superSize.width) / 3;
        int height = superSize.height;
        return new Dimension(width, height);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        LayoutExample2 mainPanel = new LayoutExample2();
        JFrame frame = new JFrame("LayoutExample");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}
person DontKnowMuchBut Getting Better    schedule 07.06.2020
comment
Если я создам каждую строку как отдельную панель, как я могу центрировать возраст и пол метки? С помощью panel.setallignement(FlowLayout.Centre). - person user10600161; 07.06.2020
comment
@ user10600161: по умолчанию он уже центрирован. Вам действительно захочется опубликовать свой минимально воспроизводимый код примера, чтобы увидеть, что вы делаете, работает или не работает. . - person DontKnowMuchBut Getting Better; 07.06.2020
comment
@ user10600161: см. дополнение к ответу - person DontKnowMuchBut Getting Better; 07.06.2020
comment
ОП: Как я могу сделать это, используя FlowLayout? Я предполагаю, что вы поняли из двух ответов, ни один из которых только не использовал макет потока, такая схема потока сама по себе не может выполнить требование. - person Andrew Thompson; 07.06.2020
comment
@AndrewThompson: да, я бы тоже. Обычно я использую Grid Bag для создания таких форм, создавая, а затем используя служебный метод, облегчающий создание объекта GridBagConstraint для каждого добавленного элемента. - person DontKnowMuchBut Getting Better; 07.06.2020