6

我一直在尝试在 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

4

3 回答 3

8

两个基本建议:

1.)当你使用swing,并且东西没有显示/更新时,你应该调用JPanel.revalidate()JPanel.repaint()两个函数来更新你的面板。如果您使用的是 JFrame 并且没有向其中添加任何额外的面板,那么您可以通过以下方式获取内容面板JFrame.getContentPane()

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

于 2012-09-06T07:44:03.783 回答
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
  }
于 2012-09-06T07:40:31.160 回答
1

for built_in FlowLayout(for JPanel) 我不建议使用pack()for JFrame,当然正确的方法可能是使用正确和更好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();
            }
        });
    }
}
于 2012-09-06T07:41:03.183 回答