我一直在尝试在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答案 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}对于这项工作,LayoutManager
或GridBagLayout
使用SpringLayout
而不使用JFrame#setSize()
例如
pack()