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

4

我不太擅长解释,但我会尽力。

基本上,我一直在尝试在我的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();
            }
        });
    }
}

这是结果: 图像1:结果 这就是我想要的边框效果: 图像2:我想要的外观 希望这些图片能更好地解释,如果需要,我会回复并提供更多问题。
2个回答

6

默认情况下,框架具有 BorderLayout。将未带约束条件的组件添加到边框布局中,该组件将被放置在 CENTER。位于边框布局中心的组件将被拉伸以填满可用空间的整个宽度和高度。

可以通过更改来解决:

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

第二个问题可以通过将边框设置为复合边框来解决,该复合边框将EmptyBorderTitledBorder组合在一起。
    Border border = new CompoundBorder(
            new TitledBorder("Login"), 
            new EmptyBorder(40, 50, 40, 50));
    loginPanel.setBorder(border);
    //loginPanel.setBorder(BorderFactory.createTitledBorder("Login"));

3
使用第二个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组件会占用所有可用空间。使用GridBagLayout可以更好地控制空间使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接