在制作JFrame时调用此代码段,当它到达dispose()行时,它不会关闭。我知道它正在进入那个块,因为另一个JFrame确实打开了,唯一的问题是它没有关闭。有谁知道为什么?
public LogIn(String title)
{
super(title);
checker = new Open("");
deserializeOpen();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
getContentPane().setLayout(new BorderLayout());
getContentPane().setBackground(Color.orange);
Login = new JButton("Login");
Create = new JButton("New Profile");
Login.addActionListener(this);
Create.addActionListener(this);
buttons = new JPanel();
buttons.setBackground(Color.orange);
buttons.setLayout(new GridLayout(0,2));
buttons.add(Login);
buttons.add(Create);
Title = new JLabel("Scrambler");
Title.setFont(new Font("Times New Roman", Font.BOLD, 24));
Name = new JTextField(4);
name = new JLabel("Name:");
password = new JPasswordField(4);
pass = new JLabel("Password:");
Text = new JPanel();
Text.setLayout(new GridLayout(6,0));
Text.setBackground(Color.orange);
Text.add(Title);
Text.add(name);
Text.add(Name);
Text.add(pass);
Text.add(password);
getContentPane().add(Text, BorderLayout.CENTER);
getContentPane().add(buttons, BorderLayout.SOUTH);
show();
}
public void deserializeOpen()
{
try
{
FileInputStream door = null;
try
{
door = new FileInputStream("Check.ser");
}
catch (FileNotFoundException e)
{
new Activator();
dispose();
}
if(door!=null)
{
ObjectInputStream reader = new ObjectInputStream(door);
checker = (Open) reader.readObject();
}
}
catch (IOException e){e.printStackTrace();}
catch (ClassNotFoundException e){e.printStackTrace();}
}
这些只是代码的两个部分,正文是第一部分,反序列化的是导致问题的部分
我很确定到达dispose()行是因为我只是将一个System.out.print()放在dispose()的下方和下方,并且都打印出来
答案 0 :(得分:0)
在JFrame子类的构造函数中,首先调用deserializeOpen()
,它会释放帧(没有效果,因为它尚未显示),然后调用show()
打开帧。所以你可能打算打开 - 关闭,而是你的代码关闭 - 打开。
顺便说一句:自JDK1.5以来不推荐show()
方法,你应该使用setVisible(true)
。
我建议您在deserializeOpen()
中传播异常并将其捕获到外面,这样您就可以决定是否打开框架而不是打开和关闭它:
public void deserializeOpen() throws Exception { ... }
在构造函数中:
try {
deserializeOpen();
setVisible(true);
} catch(Exception e) {
e.printStacktrace(); // or any other error handling
}