文本框在Swing布局中被压扁

时间:2014-04-25 01:41:26

标签: java swing modal-dialog

我点击文件>新用户时会打开一个框架,但文本字段都会被挤压在一起。

我试图让它们全部垂直堆叠,因此我使用new GridLayout(3, 2)作为我的LayoutManager。但是,新窗口的内容一直都在底部。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class App extends JFrame implements ActionListener
{
    private final int WIDTH = 300;
    private final int HEIGHT = 550;
    private int control = 0;
    String[] username = new String[10];
    String[] pass = new String[10];
    private String tempName;
    private String tempPass;

    Container con = getContentPane();
    JPanel panel = new JPanel();
    private JTextField name = new JTextField();
    private JPasswordField password = new JPasswordField();

    JMenuBar mainBar = new JMenuBar();
    JMenu menu1 = new JMenu("File");
    JMenu menu2 = new JMenu("Edit");
    JMenuItem newUser = new JMenuItem("New User");

    JButton but1 = new JButton("Log In");
    JButton but2 = new JButton("test");

    JLabel error = new JLabel("Login info not corret\n Or user not registered.");
    JLabel success = new JLabel("Success!");

    /////////////stuff for dialog///////////////////
    JPanel panel2 = new JPanel();
    JTextField newModalUser = new JTextField();
    JPasswordField newModalPass = new JPasswordField();
    JPasswordField newModalPassCon = new JPasswordField();
    JButton register = new JButton("Register");
    ////////////////////////////////////////////////
    public static void main(String[] args)
    {
       App frame = new App();
    }

    public App()
    {
       //just settin some stuff up
       super("For The Bold");
       setSize(WIDTH, HEIGHT);

       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setLocationRelativeTo(null);
       //setResizable(false);
       setVisible(true);

       //add menubar
       setJMenuBar(mainBar);
       mainBar.add(menu1);
       menu1.add(newUser);

       //background of main JFrame
       setContentPane(new JLabel(new ImageIcon("//Users//ryanchampin//Desktop//GUI app//image.png")));

       //test names in the arrays 
       username[0] = "ryan";
       pass[0] = "test";

       //main stuff in the middle
       //panel.setBackground(Color.RED);
       panel.setSize(300,300);
       panel.add(name);
       panel.add(password);
       panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS ));
       panel.add(but1);

       panel.add(but2);

       add(panel,new GridBagConstraints());
       setLayout(new GridBagLayout());

       //assign action listener
       but1.addActionListener(this);
       newUser.addActionListener(this);

       register.addActionListener(this);
   }


   public void actionPerformed(ActionEvent e)
   {
      Object source = e.getSource();
      tempName = name.getText();
      tempPass = password.getText();

      if(source == but1)
      {
            for(int x = 0; x < username.length; x++)
            {
                if(tempName.equalsIgnoreCase(username[x]) && tempPass.equals(pass[x]))
                {               
                    //display success JLabel
                    add(success);
                    System.out.println("success");
                    break;
                }
                else 
                {
                    success.setText(null);
                    add(error);
                    name.setText(null);
                    password.setText(null);
                }   
            }
       }
       else
          if(source == newUser)
          {
               panel.setVisible(false);
               setLayout(new GridLayout(3,2));
               add(panel2);
               panel2.add(newModalUser);
               panel2.add(newModalPass);
               panel2.add(newModalPassCon);
               panel2.add(register);
          }
          else if(source == register)
               System.out.println("yay it worked");
   }
}

3 个答案:

答案 0 :(得分:1)

  • 如果可能,请避免使用setSize(...)setPreferredSize(...)
  • 而是让组件及其布局管理器设置自己的大小。
  • 使用CardLayout交换视图而不是您正在做的事情。如果你这样做,CardLayout将调整其容器的大小以适应它给出的所有“卡”。
  • 添加所有组件后,不要忘记在GUI 上调用pack()
  • 添加所有组件后以及调用pack后,请不要忘记致电setVisible(true)
  • 在创建新的JTextFields和JPasswordFields时,将int数量传入构造函数。

修改
你问:

  

whats pack()用于?

pack()方法告诉GUI让其组成容器的所有布局管理器布置其组件,然后在每个组件正确放置后设置GUI的最佳大小。

答案 1 :(得分:0)

如果您想要GridLayout中的间距,可以使用setHgap(int)setVgap(int)方法设置网格中每个元素之间显示的空间像素数。< / p>

在您的代码中,有两种方法可以执行此操作:构造GridLayout并在其上调用两个setter方法,然后将其传递到setLayout(LayoutManager)方法:

GridLayout layout = new GridLayout(3, 2);
layout.setHgap(5); // or whatever number of pixels you want
layout.setVgap(5); // same
setLayout(layout);

或者,您可以通过调用LayoutManager来转换getLayout(),并在其上调用两种方法:

setLayout(new GridLayout(3, 2));
((GridLayout) getLayout()).setHgap(5);
((GridLayout) getLayout()).setVgap(5);

答案 2 :(得分:0)

如果您希望它们垂直堆叠,那么使用BoxLayout会更容易吗?