如何在 JFrame 中的特定 JPanel 周围设置边框?
How to set a border around a specific JPanel in the JFrame?
我不太会解释,但我会尽力的。
我基本上一直在尝试在 JPanel
中的 JLabel
、JTextField
和 JButton
组件周围添加边框,但是边框正在扩展尺寸。
这是我的代码:
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 个可以通过使边框成为组合边框 EmptyBorder
和 TitledBorder
的复合边框来修复。
Border border = new CompoundBorder(
new TitledBorder("Login"),
new EmptyBorder(40, 50, 40, 50));
loginPanel.setBorder(border);
//loginPanel.setBorder(BorderFactory.createTitledBorder("Login"));
我不太会解释,但我会尽力的。
我基本上一直在尝试在 JPanel
中的 JLabel
、JTextField
和 JButton
组件周围添加边框,但是边框正在扩展尺寸。
这是我的代码:
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 个可以通过使边框成为组合边框 EmptyBorder
和 TitledBorder
的复合边框来修复。
Border border = new CompoundBorder(
new TitledBorder("Login"),
new EmptyBorder(40, 50, 40, 50));
loginPanel.setBorder(border);
//loginPanel.setBorder(BorderFactory.createTitledBorder("Login"));