无法从另一个 class 打开带有 JButton 的新 JFrame

Unable to open new JFrame with JButton from a different class

这是我的代码:

登录页面:

public class LoginPage {

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                LoginPage window = new LoginPage();
                window.frmLoginPage.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

private JFrame frmLoginPage;
private JPasswordField passwordField;
private JTextField textField;

/**
 * Create the application.
 */
public LoginPage() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmLoginPage = new JFrame();
    frmLoginPage.setTitle("Login Page");
    frmLoginPage.getContentPane().setBackground(new Color(100, 149, 237));
    frmLoginPage.setBounds(100, 100, 742, 597);
    frmLoginPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frmLoginPage.getContentPane().setLayout(null);

    JPanel panel = new JPanel();
    panel.setBorder(new LineBorder(new Color(0, 0, 0), 3, true));
    panel.setBackground(Color.WHITE);
    panel.setBounds(131, 106, 459, 288);
    frmLoginPage.getContentPane().add(panel);
    panel.setLayout(null);

    JLabel lblUserLogin = new JLabel("User Login");
    lblUserLogin
            .setIcon(new ImageIcon(LoginPage.class.getResource("/javax/swing/plaf/metal/icons/ocean/info.png")));
    lblUserLogin.setFont(new Font("Trebuchet MS", Font.PLAIN, 34));
    lblUserLogin.setHorizontalAlignment(SwingConstants.CENTER);
    lblUserLogin.setBounds(114, 16, 243, 39);
    panel.add(lblUserLogin);

    JLabel lblUserId = new JLabel("User ID:");
    lblUserId.setBounds(52, 75, 90, 20);
    panel.add(lblUserId);

    JLabel lblPassword = new JLabel("Password:");
    lblPassword.setBounds(52, 140, 90, 20);
    panel.add(lblPassword);

    passwordField = new JPasswordField();
    passwordField.setBounds(52, 176, 282, 26);
    panel.add(passwordField);

    textField = new JTextField();
    textField.setBounds(52, 98, 283, 26);
    panel.add(textField);
    textField.setColumns(10);

    JButton btnLogIn = new JButton("Log In");
    btnLogIn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            new SemesterPage();
            frmLoginPage.setVisible(false);
        }
    });

    btnLogIn.setBounds(52, 219, 115, 29);
    panel.add(btnLogIn);

    JButton btnRegister = new JButton("Register");
    btnRegister.setBounds(179, 219, 115, 29);
    panel.add(btnRegister);
}

}

当按钮 "Log In" 被点击时,这个 class 中的新 window 应该会弹出:

学期页数:

public class SemesterPage {

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                SemesterPage window = new SemesterPage();
                window.frmControlPanel.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

private JFrame frmControlPanel;

/**
 * Create the application.
 */
public SemesterPage() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmControlPanel = new JFrame();
    frmControlPanel.setTitle("Control Panel");
    frmControlPanel.setBounds(100, 100, 1000, 1000);
    frmControlPanel.getContentPane().setBackground(new Color(100, 149, 237));

    JPanel panel = new JPanel();
    panel.setBorder(new LineBorder(new Color(0, 0, 0), 2, true));

    JPanel panel_1 = new JPanel();
    panel_1.setBorder(new LineBorder(new Color(0, 0, 0), 2, true));

    JPanel panel_2 = new JPanel();
    panel_2.setBorder(new LineBorder(new Color(0, 0, 0), 2, true));
    GroupLayout groupLayout = new GroupLayout(frmControlPanel.getContentPane());
    groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(Alignment.LEADING).addGroup(groupLayout
            .createSequentialGroup().addContainerGap()
            .addComponent(panel, GroupLayout.PREFERRED_SIZE, 637, GroupLayout.PREFERRED_SIZE).addGap(30)
            .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                    .addComponent(panel_1, GroupLayout.DEFAULT_SIZE, 281, Short.MAX_VALUE)
                    .addComponent(panel_2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addContainerGap()));
    groupLayout.setVerticalGroup(groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup().addContainerGap()
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(panel, GroupLayout.PREFERRED_SIZE, 793, GroupLayout.PREFERRED_SIZE)
                            .addGroup(groupLayout.createSequentialGroup()
                                    .addComponent(panel_1, GroupLayout.PREFERRED_SIZE, 370,
                                            GroupLayout.PREFERRED_SIZE)
                                    .addGap(18).addComponent(panel_2, GroupLayout.PREFERRED_SIZE, 412,
                                            GroupLayout.PREFERRED_SIZE)))
                    .addContainerGap(97, Short.MAX_VALUE)));
    frmControlPanel.getContentPane().setLayout(groupLayout);
    frmControlPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JMenuBar menuBar = new JMenuBar();
    frmControlPanel.setJMenuBar(menuBar);

    JMenu mnFile = new JMenu("File");
    menuBar.add(mnFile);

    JMenuItem mntmNew = new JMenuItem("New");
    mnFile.add(mntmNew);

    JMenuItem mntmSave = new JMenuItem("Save");
    mnFile.add(mntmSave);

    JMenuItem mntmLogOut = new JMenuItem("Log Out");
    mnFile.add(mntmLogOut);
}

}

问题是,window 没有弹出。单击按钮时没有任何反应。我有一种感觉,当我调用 "new SemesterPage()" 时,我的 SemesterPage class 中的构造函数没有启动 JFrame。我将如何解决这个问题?

非常感谢!

您创建了 SemesterPage 的新实例,但从未使其可见...

您的 SemesterPage 将需要一个方法,该方法将允许调用者指示它希望使它创建的 JFrame 的实例可见

也许像...

public class SemesterPage {

    private JFrame frmControlPanel;

    //...
    public void setVisible(boolean v) {
        frmControlPanel.setVisible(v);
    }

话虽如此,您可能想稍微重新考虑一下您的设计...

先看看 The Use of Multiple JFrames, Good/Bad Practice?

然后 How to Make Dialogs and How to Use CardLayout 一些关于替代方案的想法

您也可以考虑看看 Model-View-Controller, for example