为什么 "dispose()" 和 "setVisible()" 没有关闭表单?

Why "dispose()" and "setVisible()" isn't close the form?

我从 JFrame class 获得了 2 个表单。通过单击按钮,必须关闭其中一个并打开另一个。我试过 "setVisible()" 和 "dispose()",结果是一样的——什么都没有改变。在我的 classes 代码下方,版本为 "dispose()"-try:

 public static void btnEnterHandler() throws Exception{
    JFrame mainFrame = Forms.mainFrameDraw(new Chat());
    JFrame enterFrame = Forms.enterFrameDraw(new Chat());
    try{
        enterFrame.dispose();
        mainFrame.setVisible(true);
    } catch(Exception ex2) {
        Logger.getLogger(enterFrame.getName());
    }
    //todo stopped here!
}

和 class 的形式:

public static JFrame mainFrameDraw(JFrame frame) {
    textAreaMain = new JTextArea(FRM_HEIGHT / 19, 50);
    textFieldMessage = new JTextField();
    textAreaMain.setLineWrap(true);
    textAreaMain.setEditable(false);
    JScrollPane spMain = new JScrollPane(textAreaMain);
    spMain.setLocation(0, 0);

    JButton btnSend = new JButton();
    btnSend.setText("Send");
    btnSend.setToolTipText("Broadcast a message");
    btnSend.addActionListener(e -> {
        try {
            Chat.btnSendHandler();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    });

    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setTitle(FRM_TITLE);
    frame.setLocation(FRM_LOC_X, FRM_LOC_Y);
    frame.setSize(FRM_WIDTH, FRM_HEIGHT);
    frame.setResizable(false);
    frame.getContentPane().add(BorderLayout.NORTH, spMain);
    frame.getContentPane().add(BorderLayout.CENTER, textFieldMessage);
    frame.getContentPane().add(BorderLayout.EAST, btnSend);
    frame.setVisible(false);

    return frame;
}

public static JFrame enterFrameDraw(JFrame frame){
    JButton btnEnter = new JButton("Sign in!");
    textFieldLogin = new JTextField("Login!");
    btnEnter.addActionListener(e -> {
        try{
            Chat.btnEnterHandler();
        } catch (Exception e2){
            e2.printStackTrace();
        }
    });


    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setTitle(FRM_TITLE);
    frame.setLocation(FRM_LOC_X, FRM_LOC_Y);
    frame.setSize(FRM_WIDTH, FRM_HEIGHT);
    frame.getContentPane().add(BorderLayout.PAGE_START, textFieldLogin);
    frame.setResizable(false);
    frame.getContentPane().add(BorderLayout.PAGE_END, btnEnter);
    frame.setVisible(true);

    return frame;
}

}

不全是代码。但我认为,这就足够了。如果您需要更多 - 告诉我。

首先,尽量避免只使用静态 类,因为它实际上不是 java 的意思。获得一些关于 SOLID 原则 的知识,它会帮助你很多。

如果是关于您的情况:

 JFrame mainFrame = Forms.mainFrameDraw(new Chat());
 JFrame enterFrame = Forms.enterFrameDraw(new Chat());

单击按钮似乎正在初始化全新的框架,然后立即关闭其中一个:

enterFrame.dispose();

您想要做的是在 btnEnterHandler() 中包含 JFrame 的实例。

工作示例(但仍然请考虑不要使用这么多静态!):

public static JFrame enterFrameDraw(JFrame frame){
    //...
    btnEnter.addActionListener(e -> {
        try{
            Chat.btnEnterHandler(frame);
        } catch (Exception e2){
            e2.printStackTrace();
        }
    });

然后你的处理程序看起来像:

public static void btnEnterHandler(JFrame frame) throws Exception{
    JFrame mainFrame = Forms.mainFrameDraw(new Chat());
    try{
        frame.dispose();
        mainFrame.setVisible(true); //i'm pretty sure its not necessary because its visible by default
    } catch(Exception ex2) {
        Logger.getLogger(enterFrame.getName());
    }
}