为什么 "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());
}
}
我从 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());
}
}