如何在JFrame中围绕特定JPanel设置边框?

Fai*_*que 4 java swing layout-manager gridbaglayout border-layout

我解释不好,但我会尽我所能.

我基本已经尝试添加在我的边框JLabel,JTextFieldJButton我的内的组件JPanel,但边境根据规模不断扩大.

这是我的代码:

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

public class LoginPanel
{
    private JPanel loginPanel = new JPanel();
    private JFrame loginFrame = new JFrame();

    public LoginPanel()
    {
        loginPanel.setLayout(new GridBagLayout());

        GridBagConstraints gridBagConstraints = new GridBagConstraints();

        JTextField textLogin = new JTextField(10);
        JPasswordField password = new JPasswordField(10);

        JButton login = new JButton("Login");
        JButton register = new JButton("Register");

        gridBagConstraints.insets = new Insets(0,0,0,0);

        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridx = 0;

        loginPanel.setBorder(BorderFactory.createTitledBorder("Login"));

        loginPanel.add(new JLabel("E-Mail"), gridBagConstraints);
        gridBagConstraints.gridy++;
        loginPanel.add(textLogin, gridBagConstraints);
        gridBagConstraints.gridy++;

        loginPanel.add(new JLabel("Password"), gridBagConstraints);
        gridBagConstraints.gridy++;
        loginPanel.add(password, gridBagConstraints);
        gridBagConstraints.gridy++;

        loginPanel.add(login, gridBagConstraints);
        gridBagConstraints.gridy++;
        loginPanel.add(register, gridBagConstraints);

        loginFrame.pack();
        loginFrame.add(loginPanel);
        loginFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        loginFrame.setLocationRelativeTo(null);
        loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        loginFrame.setVisible(true);
    }

    public static void main(String[] args)
    {
        try
        {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch(Exception e)
        {
            e.printStackTrace();
        }

        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new LoginPanel();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是结果: 图1:结果

这就是我想要的边框: 图2:我希望看起来像什么.

希望图像解释更多,我会回复并提供所需的更多问题.

And*_*son 6

BorderLayout默认情况下,框架具有.添加到没有约束的边框布局的组件放入CENTER.边框布局中心的组件将拉伸到可用空间的整个宽度和高度.

它可以通过改变来修复:

    loginFrame.pack();
Run Code Online (Sandbox Code Playgroud)

至:

    loginFrame.setLayout(new GridBagLayout());
    loginFrame.pack();
Run Code Online (Sandbox Code Playgroud)

由于添加到GridBagLayout没有约束的单个组件将居中.

其他提示:

GUI不会出现在此处,就像在屏幕截图中一样.相反,组件更紧密,标题边框紧贴它们.

第一个可以通过改变来修复:

    gridBagConstraints.insets = new Insets(0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

至:

    gridBagConstraints.insets = new Insets(5, 5, 5, 5);
Run Code Online (Sandbox Code Playgroud)

所述第二可通过使边界相结合的化合物的边界被固定EmptyBorderTitledBorder.

    Border border = new CompoundBorder(
            new TitledBorder("Login"), 
            new EmptyBorder(40, 50, 40, 50));
    loginPanel.setBorder(border);
    //loginPanel.setBorder(BorderFactory.createTitledBorder("Login"));
Run Code Online (Sandbox Code Playgroud)