为什么“dispose()”和“setVisible()”不接近表格?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么“dispose()”和“setVisible()”不接近表格?相关的知识,希望对你有一定的参考价值。

我从JFrame类得到了2个表单。通过按钮单击,其中一个必须关闭,另一个打开。我试过“setVisible()”和“dispose()”,结果是一样的 - 没有什么变化。在我的带有“dispose()”版本的类代码下面 - 尝试:

 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!
}

和表格类:

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();

你想要做的是在JFrame中有btnEnterHandler()的实例。

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

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());
    }
}

以上是关于为什么“dispose()”和“setVisible()”不接近表格?的主要内容,如果未能解决你的问题,请参考以下文章

C# IDisposable 类,正确使用 Dispose,获取错误“dispose”需要 1 个参数

SQL中的close和dispose有啥区别? [复制]

Three.js Collada - dispose() 和释放内存(垃圾收集)的正确方法是啥?

在 dispose() 之后调用 setState()

为啥我需要 Dispose 一个 System.Net.Mail.MailMessage 实例?

为啥在 BinaryReader 上调用 Dispose() 会导致编译错误?