Как исправить положение JPanels после расширения JFrame

Я пытаюсь создать интерфейс программы с использованием Java Swing. У меня есть контейнер, в который я добавляю 3 панели JPanel с некоторыми компонентами. Проблема в том, что когда я расширяю фрейм, все эти 3 панели JPanel располагаются в первой строке одна за другой.

Вот мой код:

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.border.LineBorder;

public class GraphicRefact extends JFrame {
    private Container container;

    private JButton button2;
    private JButton button1;
    private JTextField textField01;
    private JLabel label01;

    private JButton button03;
    private JButton button04;
    private JTextField textField03;
    private JLabel label03;

    private JButton button02;
    private JButton button01;
    private JTextField textField02;
    private JLabel label02;

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

    public GraphicRefact() {
        initializeComponents();

        setTitle("Title");
        setSize(500, 150);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        container = new JPanel();


        JPanel panel01 = new JPanel();

        panel01.add(label01);
        panel01.add(textField01);
        panel01.add(button2);
        panel01.add(button1);
        panel01.setBorder(new LineBorder(Color.BLACK, 3));
        container.add(panel01);



        JPanel panel02 = new JPanel();

        panel02.add(label02);
        panel02.add(textField02);
        panel02.add(button02);
        panel02.add(button01);
        container.add(panel02);

        JPanel panel03 = new JPanel();

        panel03.add(label03);
        panel03.add(textField03);
        panel03.add(button03);
        panel03.add(button04);
        container.add(panel03);

        add(container);

    }

    private void initializeComponents() {

        button1 = new JButton("Open");
        button2 = new JButton("Close");
        textField01 = new JTextField("Choose the path...");
        label01 = new JLabel("Choose File: ");

        button01 = new JButton("Button01");
        button02 = new JButton("Button02");
        textField02 = new JTextField("Choose the path...");
        label02 = new JLabel("Choose Dir:");

        button03 = new JButton("Button03");
        button04 = new JButton("Button03");
        textField03 = new JTextField("Choose the path...");
        label03 = new JLabel("Choose Dir:");
    }

}

Вот как выглядит программа до и после того, как я растягиваю фрейм.

До:

Как исправить положение JPanels после расширения JFrame

После:

Как исправить положение JPanels после расширения JFrame

Итак, даже после того, как я расширю фрейм, я хочу, чтобы программа оставила эти 3 панели JPanel в середине cotainer'а.

Спасибо!

Попробуйте что-нибудь вроде .. container = new JPanel(new GridLayout(0,1));

Andrew Thompson 27.12.2018 15:16

Не используйте FlowLayout JPanel по умолчанию, а вложите каждую JPanel в более мощный макет. Вы можете найти руководство по управлению компоновкой здесь: Руководство по Layout Manager, а также ссылки на учебные материалы по Swing и другие ресурсы Swing здесь: Информация о качелях.

Hovercraft Full Of Eels 27.12.2018 15:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
462
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы должны использовать правильный LayoutManager. Посмотрите там примеры. BoxLayout кажется тем, что вам нужно.

Я не вижу, где вы определили какие-либо позиции для чего-либо, если вам нужно прочитать, как это делается, вы можете начать здесь

Размещение JPanel в JFrame в определенной позиции

Встроенный менеджер компоновки java swing не так полезен. Вы должны использовать это

frame.setLayout(null);
component.setLocation(x, y);
frame.add(component);

Привет, добро пожаловать в SO :) Обратите внимание, что абсолютное позиционирование компонентов на самом деле не рекомендуется. Как уже упоминалось, Swing разработан для использования с LayoutManagers, который может плавно управлять размером и позиционированием компонентов независимо от размера и разрешения экрана.

dic19 27.12.2018 15:46
Ответ принят как подходящий

Вы можете установить Макет сетки и поместить внутрь эти элементы.

JPanel jp = new JPanel();
GridLayout gl = new GridLayout(3,4); //3 rows, 4 columns
jp.setLayout(gl);

После этого просто разместите элементы внутренний макет по порядку.

jp.add(label1);
jp.add(button1);
//etc...

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