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

How to set a border around a specific JPanel in the JFrame?

我不太会解释,但我会尽力的。

我基本上一直在尝试在 JPanel 中的 JLabelJTextFieldJButton 组件周围添加边框,但是边框正在扩展尺寸。

这是我的代码:

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();
            }
        });
    }
}

这是结果:

这就是我想要的边框:

希望图片能说明更多,我会回复并提供更多需要的问题。

为您的框架使用第二个 GridBagLayout:

    ...
    loginFrame.setLayout(new GridBagLayout());
    loginFrame.add(loginPanel, new GridBagConstraints(
        0, 0,
        1, 1, 
        0.0, 0.0, 
        GridBagConstraints.CENTER, GridBagConstraints.NONE, 
        new Insets(0, 0, 0, 0), 40, 20));
    ...

JFrame 默认使用 BorderLayout - 它的 CENTER 组件将使用所有可用的 space。使用 GridBagLayout 可以更好地控制 space 用法。

一个框架默认有一个BorderLayout。无约束添加到边框布局的组件放在 CENTER 中。边框布局中心的组件将被拉伸到可用 space.

的全部宽度和高度

可以通过更改来修复:

    loginFrame.pack();

收件人:

    loginFrame.setLayout(new GridBagLayout());
    loginFrame.pack();

由于添加到 GridBagLayout 的单个组件没有约束,因此将居中。

其他提示:

此处未显示 GUI,如您的屏幕截图所示。相反,组件靠得更近,带标题的边框紧贴它们。

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

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

收件人:

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

第 2 个可以通过使边框成为组合边框 EmptyBorderTitledBorder 的复合边框来修复。

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