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

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

inheritance我的代码:

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

您永远不会将您的内容添加到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.)当你使用swing,并且东西没有显示/更新时,你应该调用JPanel.revalidate()JPanel.repaint()这两个函数将更新你的面板。 如果您使用的是JFrame并且没有添加任何额外的面板,那么您可以通过JFrame.getContentPane()获取内容面板

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

对于built_in FlowLayout (对于JPanel )我不建议对JFrame使用pack() ,确定正确的方法是使用适当的和更好的LayoutManager来完成这个作业, GridBagLayoutSpringLayout

通过使用JFrame#setSize()和没有pack()

在此处输入图像描述

例如

 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class MainLogin implements ActionListener { private JFrame loginFrame = new JFrame("Encrypted Chat - Login"); private JPanel pnl = new JPanel(); private JLabel userLabel; private JLabel passLabel; private JTextField userField; private JTextField passField; private JButton login; private JButton closeLogin; private JButton help; public MainLogin() { 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); pnl.add(userLabel); pnl.add(userField); pnl.add(passLabel); pnl.add(passField); pnl.add(login); pnl.add(help); pnl.add(closeLogin); loginFrame.add(pnl); loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); loginFrame.setSize(300, 125); loginFrame.setResizable(false); loginFrame.setVisible(true); } public void actionPerformed(ActionEvent e) { } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { public void run() { MainLogin mainLogin = new MainLogin(); } }); } }