为什么“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 个参数
Three.js Collada - dispose() 和释放内存(垃圾收集)的正确方法是啥?