Как выравнивание по верхнему краю рядом расположенных панелей, Java Swing

Я хочу, чтобы мои панели разной высоты были выровнены по верхнему краю внутри содержащей их панели.

Я пробовал BorderLayout с NORTH, я пробовал panel.setAlignmentY(TOP_ALIGNMENT). Пока не повезло ни с одним подходом.

Как выравнивание по верхнему краю рядом расположенных панелей, Java SwingКак выравнивание по верхнему краю рядом расположенных панелей, Java Swing

(Чтобы опубликовать, меня просят дать больше описания. Оставшийся текст (кроме кода) — моя попытка удовлетворить это требование.) Вы можете видеть небольшие панели, содержащие имена «меток x», каждая из которых расположена вертикально. Я определенно хочу вертикальную укладку компонентов внутри панелей, и у меня определенно будут панели разной высоты; не просите меня сделать панели одинаковой высоты — это мой художественный выбор, чтобы их нижняя часть не совпадала.

    package view;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GUI2 extends JFrame {
    private static final long serialVersionUID = 1L;


    public GUI2() {
        setTitle("Paddle Events");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 200);
        setLocation(100, 100);
        
        // nesting enables me to see the border of the panel
        getContentPane().add(getMainPanel());

        setVisible(true);
    }


    private Component getMainPanel() {
        JPanel panel = new JPanel();
        panel.add(getGreenPanel());
        panel.add(getDarkGrayPanel());
        return panel;
    }


    private JPanel getGreenPanel() {
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.green));
        panel.setPreferredSize(new Dimension(175, 100));
        
        panel.add(getWrapperA());
        panel.add(getWrapperB());
        panel.add(getWrapperC());

        return panel;
    }


    private JPanel getDarkGrayPanel() {
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
        panel.setPreferredSize(new Dimension(150, 70));
        
        panel.add(getWrapperA());
        panel.add(getWrapperB());
        panel.add(getWrapperC());

        return panel;
    }


    private Component getWrapperA() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(BorderFactory.createLineBorder(Color.black));

        panel.add(new JLabel("label 1"));
        panel.add(new JLabel("label 2"));
        panel.add(new JLabel("label 3"));

        return panel;
    }


    private Component getWrapperB() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(BorderFactory.createLineBorder(Color.blue));
        panel.setAlignmentY(TOP_ALIGNMENT); // pointless

        panel.add(new JLabel("label 4"));
        panel.add(new JLabel("label 5"));

        return panel;
    }


    private Component getWrapperC() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(BorderFactory.createLineBorder(Color.red));

        panel.add(new JLabel("label 6"));

        return panel;
    }


    public static void main(String[] args) {
        new GUI2();
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может быть другой способ добиться того же, но для меня используйте GridBagLayout, см. Как использовать GridBagLayout для более подробной информации.

import java.awt.Color;
import java.awt.Component;
import static java.awt.Component.TOP_ALIGNMENT;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JFrame {
    private static final long serialVersionUID = 1L;

    public Main() {
        setTitle("Paddle Events");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 200);
        setLocation(100, 100);

        // nesting enables me to see the border of the panel
        getContentPane().add(getMainPanel());

        setVisible(true);
    }

    private Component getMainPanel() {
        JPanel panel = new JPanel();
        panel.add(getGreenPanel());
        panel.add(getDarkGrayPanel());
        return panel;
    }

    private JPanel getGreenPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weighty = 1;
        gbc.anchor = gbc.PAGE_START;
        gbc.insets = new Insets(4, 2, 4, 2);
        panel.setBorder(BorderFactory.createLineBorder(Color.green));
        panel.setPreferredSize(new Dimension(175, 100));

        panel.add(getWrapperA(), gbc);
        panel.add(getWrapperB(), gbc);
        panel.add(getWrapperC(), gbc);

        return panel;
    }

    private JPanel getDarkGrayPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weighty = 1;
        gbc.anchor = gbc.PAGE_START;
        gbc.insets = new Insets(4, 2, 4, 2);
        panel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
        panel.setPreferredSize(new Dimension(150, 70));

        panel.add(getWrapperA(), gbc);
        panel.add(getWrapperB(), gbc);
        panel.add(getWrapperC(), gbc);

        return panel;
    }

    private Component getWrapperA() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(BorderFactory.createLineBorder(Color.black));

        panel.add(new JLabel("label 1"));
        panel.add(new JLabel("label 2"));
        panel.add(new JLabel("label 3"));

        return panel;
    }

    private Component getWrapperB() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(BorderFactory.createLineBorder(Color.blue));
        panel.setAlignmentY(TOP_ALIGNMENT); // pointless

        panel.add(new JLabel("label 4"));
        panel.add(new JLabel("label 5"));

        return panel;
    }

    private Component getWrapperC() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(BorderFactory.createLineBorder(Color.red));

        panel.add(new JLabel("label 6"));

        return panel;
    }

    public static void main(String[] args) {
        new Main();
    }
}

ВОТ ЭТО ДА!! Вы быстры, и это полностью решило проблему, как видно из моего локального запуска. Я немного изучу ваш ответ. Большое спасибо.

shrimpwidget 23.03.2022 02:46

Другие вопросы по теме