GUI元素直到调整窗口大小才显示

时间:2012-09-06 07:32:42

标签: java swing

我一直在尝试在java中制作GUI而不是一直只使用“静态”并遇到“SwingUtilities.invokeLater()”方法。我设法完成所有设置但是在运行应用程序时,在我调整窗口大小之前,JPanel上没有任何内容。有没有解决这个问题,还是我做错了?

继承我的代码:

public class main extends JPanel implements ActionListener{ 
public JLabel userLabel;
public JLabel passLabel;
public JTextField userField;
public JTextField passField;
public JButton login;
public JButton closeLogin;
public JButton help;

public main(){
    userLabel = new JLabel("Username: ");
    passLabel = new JLabel("Password: ");
    userField = new JTextField(16);
    passField = new JTextField(16);

    login = new JButton("Login");
    login.setActionCommand("login");
    login.setMnemonic(KeyEvent.VK_L);
    closeLogin = new JButton("Close");
    closeLogin.setActionCommand("closeLogin");
    closeLogin.setMnemonic(KeyEvent.VK_E);
    help = new JButton("Help");
    help.setActionCommand("helpLogin");
    help.setMnemonic(KeyEvent.VK_H);

    login.addActionListener(this);
    closeLogin.addActionListener(this);
    help.addActionListener(this);

    add(userLabel);
    add(userField);
    add(passLabel);
    add(passField);
    add(login);
    add(help);
    add(closeLogin);

}
public void actionPerformed(ActionEvent e){ 
}
public static void initComponents(){
    JFrame loginFrame = new JFrame("Encrypted Chat - Login");
    loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main loginPanel = new main();
    loginPanel.setLayout(new FlowLayout());
    loginFrame.setSize(300, 125);
    loginFrame.setResizable(false);
    loginFrame.setVisible(true);        
}
public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            initComponents();
        }
    });
}

}

编辑:我知道密码JTextField是一个JPasswordField ..所以忽略它:P

3 个答案:

答案 0 :(得分:4)

您永远不会将您的内容添加到JFrame。您需要的最小变更集:

  public static void main(String args[]){
    final main main = new main();
    SwingUtilities.invokeLater(new Runnable(){
      public void run(){
        initComponents(main);
      }
    });
  }

然后修改initComponents以获取main对象:

  public static void initComponents(main main){
    JFrame loginFrame = new JFrame("Encrypted Chat - Login");
    loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main loginPanel = new main();
    loginPanel.setLayout(new FlowLayout());
    loginFrame.setSize(300, 125);
    loginFrame.setResizable(false);
    loginFrame.setVisible(true);
    loginFrame.add(main);  // <----- this line is added
  }

答案 1 :(得分:4)

两个基本建议:

1。)当您使用swing,并且内容没有显示/更新时,您应该致电JPanel.revalidate()JPanel.repaint()这两个功能将更新您的面板。 如果您使用的是JFrame并且没有添加任何额外的面板,那么您可以通过JFrame.getContentPane()

获取内容面板

2。)当您完成向面板/框架添加组件时,您还应该在框架上调用pack(),这将确保所有组件都具有首选尺寸。< / p>

答案 2 :(得分:1)

for built_in FlowLayout(适用于JPanel)我建议不要将pack()用于JFrame,确保正确的方法是使用正确且更好的{{1}对于这项工作,LayoutManagerGridBagLayout

使用SpringLayout而不使用JFrame#setSize()

输出

enter image description here

例如

pack()