在Swing

时间:2017-03-29 16:07:06

标签: java swing

我正在尝试创建一个登录页面但不幸的是我的formPanel的边界已经超出界限。在图片中你可以看到标题边框是出路。我需要它更多地围绕我的面板登录表单: enter image description here

我看到,在创建这个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);
}
}

2 个答案:

答案 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没问题,但是你的其他代码中可能有一些错误,你没有在这里发布。