JButton需要整个框架

时间:2015-06-20 08:01:23

标签: java jframe jbutton

我正在创建一个登录系统,当我创建登录按钮时,它占用了整个框架。我尝试了.setBounds();,但它没有用。不确定我做错了什么,请帮忙。

    import java.awt.FlowLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextField;

    public class Main extends JFrame{
      public Main(){
        JTextField name = new JTextField("Username");
        JTextField pass = new JTextField("Password");
        JButton login = new JButton("Login");
        name.setBounds(230, 110, 100, 25);
        pass.setBounds(230, 145, 100, 25);
        login.setBounds(230, 165, 100, 25);
        add(name);
        add(pass);
        add(login);
  }

    public static void main(String [] args) {
      Main a = new Main();
      a.setDefaultCloseOperation(EXIT_ON_CLOSE);
      a.setSize(500, 300);
      a.setLocationRelativeTo(null);
      a.setVisible(true);
      a.setTitle("Login System");
      a.setResizable(false);
      a.setLayout(new FlowLayout());

  }

}

3 个答案:

答案 0 :(得分:2)

在构造函数中

,尝试setLayout(new FlowLayout());

这可能不会导致你想要的东西,但从那里你可以进一步调查。我建议你在这里阅读布局: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

答案 1 :(得分:1)

默认情况下,Frame安装了BorderLayout。添加项目后,它们全部添加到" center"因为约束没有通过。中心组件占用BorderLayout中的所有可用空间。您可以在添加组件时更改布局管理器或提供约束。

FlowLayout或BoxLayout是这方面的好选择。

答案 2 :(得分:1)

默认情况下,JFrame的布局管理器是BorderLayout。使用方法add()添加组件后,它会添加到中心区域。因此显示了添加的最后一个组件。在您的情况下,它是登录按钮。此外setBounds()不适用于所述布局管理器。

你必须在编码风格上做很多工作。你所做的是首先创建框架并添加组件,然后在main()中设置大小,使其可见,然后将布局管理器设置为FlowLayout。

理想情况下,您必须构造框架,设置布局,向框架添加组件,使用pack()设置框架大小,设置框架的位置并最终使框架可见。

使用BorderLayout:

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Main implements Runnable {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Main());
  }

  @Override
  public void run() {
    JFrame frame = new JFrame("BorderLayout");
    frame.getContentPane().add(new JTextField(15), BorderLayout.WEST);
    frame.getContentPane().add(new JPasswordField(15), BorderLayout.CENTER);
    frame.getContentPane().add(new JButton("Login"), BorderLayout.EAST);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
  }

}

enter image description here

使用FlowLayout:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Main implements Runnable {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Main());
  }

  @Override
  public void run() {
    JFrame frame = new JFrame("FlowLayout");
    frame.getContentPane().setLayout(new FlowLayout());
    frame.getContentPane().add(new JTextField(15));
    frame.getContentPane().add(new JPasswordField(15));
    frame.getContentPane().add(new JButton("Login"));
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
  }

}

enter image description here

P.S。如果您仍想使用绝对位置,我建议您使用SpringLayout或GroupLayout。