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
来完成这个作业, GridBagLayout
或SpringLayout
通过使用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(); } }); } }