我正在尝试创建一个登录页面但不幸的是我的formPanel的边界已经超出界限。在图片中你可以看到标题边框是出路。我需要它更多地围绕我的面板登录表单:
我看到,在创建这个formPanel时,它就是那么大,边框就围绕着它。我尝试使用setPrefferedSize,但它不起作用。我该如何解决?
这是我的代码:
public class LoginPanel extends JPanel {
private JLabel title;
public LoginPanel() {
this.setBackground(new Color(0, 128, 43));
this.setBorder(new EmptyBorder(10, 10, 10, 10));
this.setLayout(new BorderLayout());
//adding the title
title = new JLabel("<html><h1><strong><i>Krisko Beatz Quiz</i></strong></h1><hr></html>");
title.setForeground(Color.BLACK);
JPanel titlePanel = new JPanel();
titlePanel.setBackground(new Color(0, 128, 43));
titlePanel.add(title);
this.add(titlePanel, BorderLayout.PAGE_START);
//creating the login form
JPanel formPanel = new JPanel(new GridBagLayout());
formPanel.setBackground(new Color(0, 128, 43));
//gbc
GridBagConstraints gbc = new GridBagConstraints();
//gbc for username
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(5, 0, 0, 0);
JLabel username = new JLabel("Username: ");
username.setForeground(Color.BLACK);
formPanel.add(username, gbc);
//gbc for textfield
gbc.gridx = 1;
gbc.gridy = 0;
JTextField usernameField = new JTextField(10);
formPanel.add(usernameField, gbc);
//gbc for pass
gbc.gridx = 0;
gbc.gridy = 1;
JLabel password = new JLabel("Password: ");
password.setForeground(Color.BLACK);
formPanel.add(password, gbc);
//gbc for pass field
gbc.gridx = 1;
gbc.gridy = 1;
JPasswordField passField = new JPasswordField(10);
formPanel.add(passField, gbc);
//gbc for button
gbc.gridx = 1;
gbc.gridy = 2;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.PAGE_END;
JButton loginButton = new JButton("Login");
formPanel.add(loginButton, gbc);
//add border to the form panel
TitledBorder title = BorderFactory.createTitledBorder("Login");
formPanel.setBorder(title);
this.add(formPanel, BorderLayout.CENTER);
}
}
答案 0 :(得分:2)
我尝试使用setPrefferedSize,但它无效。
请勿尝试管理组件的preferredSize。
我猜测问题是你使用的是setSize(...)
而不是pack()
。
在将所有组件添加到框架后,您应该使用pack()
。然后,所有组件将以其首选大小显示。
编辑:
我最初误解了你的问题并改变了原来的答案。我使用“包装”面板的原始答案中的要点是为包装面板提供额外的空间,同时将“formPanel”保持为固定大小。这样,即使框架大小发生变化,标题边框仍将保留在formPanel周围。
因此,此类解决方案的基本方法是:
JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add(formPanel, new GridBagConstraints());
this.add(wrapper, BorderLayout.CENTER);
//this.add(formPanel, BorderLayout.CENTER);
答案 1 :(得分:0)
我按原样使用了LoginPanel
类,并在其周围编写了一个Main
类来启动GUI。
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new LoginPanel());
frame.pack();
frame.setVisible(true);
});
}
}
特别注意,我没有明确设置大小,只有pack()
调用,根据您的布局调整所有内容的大小。
所以结论是:你的LoginPanel
没问题,但是你的其他代码中可能有一些错误,你没有在这里发布。