Проблемы макета с Java Swing Tools - PullRequest
       24

Проблемы макета с Java Swing Tools

1 голос
/ 01 августа 2020

Я пытаюсь создать простое окно кода регистрации GUI, в котором есть текст для ввода кода и кнопка для проверки правильности введенного кода. Точно так:

enter image description here

So I tried to do this GUI with java using Java Swing library, and that is my code:

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

public class MainClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        final JFrame appFrame = new JFrame();
        final JPanel gridPanel = new JPanel(new GridLayout(2,1));
        
        
        Font f = new Font(Font.SERIF, Font.PLAIN, 20);
        JButton registerButton = new JButton("Register!");
        registerButton.setFont(f);
        JTextField verificationCodeText = new JTextField("--Enter your registration key here--");
        
        registerButton.setSize(30,20);
        verificationCodeText.setSize(50,20);
        verificationCodeText.setHorizontalAlignment(SwingConstants.CENTER);
        Border border = BorderFactory.createLineBorder(Color.BLACK, 5);
        verificationCodeText.setFont(f);
        verificationCodeText.setBorder(border);
        
        gridPanel.add(verificationCodeText);
        gridPanel.add(registerButton);
    
        appFrame.add(gridPanel);
        appFrame.setSize(400,400);
        appFrame.setVisible(true);
        
        System.out.println("End");
    }
}

But that what I had obtained :

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

Что я могу сделать с макетами, чтобы исправить это?

(Примечание: не обращайте внимания на внешнюю черную рамку на первом изображении, это только для пояснения)

1 Ответ

3 голосов
/ 01 августа 2020

Лучше всего вкладывать JPanels, смешивать макеты по мере необходимости и использовать отступы, например, через пустые границы, что лучше, чем установка размера полностью. Поиграйте с кодом, подобным этому, например, в приведенном ниже примере используется BorderLayout в качестве общего макета, а затем добавляется FlowLayout с использованием JPanel (макет JPanel по умолчанию) вверху и GridBagLayout с использованием JPanel в центре основного JPanel. GridBag центрирует отдельный компонент, если он добавлен по умолчанию (без ограничений):

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

import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class RegistrationGUI extends JPanel {
    private JButton registerButton = new JButton("Register!");
    private JTextField verificationCodeText = new JTextField("--Enter your registration key here--", 20);
    
    public RegistrationGUI() {
        JPanel topPanel = new JPanel();
        int gap = 35;
        topPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        verificationCodeText.setHorizontalAlignment(SwingConstants.CENTER);
        topPanel.add(verificationCodeText);
        
        JPanel bottomPanel = new JPanel(new GridBagLayout());
        gap = 60;
        bottomPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        bottomPanel.add(registerButton);

        
        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.PAGE_START);
        add(bottomPanel, BorderLayout.CENTER);
    }

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

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