Java 解决2窗口同步问题
我想用这个按钮。在接受信息窗口关闭后,它将调用jFrame,我想在其中收集有关新用户的数据。 现在我想将用户集合保存到文件中。问题是:两个事件(新窗口和序列化)同时发生,所以如果我在集合中有3个用户并使用此按钮,那么这三个用户将被保存。第四个将被保存,如果我再次推它创建第五个用户。。。 我假设这是由于存在两个线程:如何使保存线程等待新窗口关闭Java 解决2窗口同步问题,java,swing,synchronization,jframe,Java,Swing,Synchronization,Jframe,我想用这个按钮。在接受信息窗口关闭后,它将调用jFrame,我想在其中收集有关新用户的数据。 现在我想将用户集合保存到文件中。问题是:两个事件(新窗口和序列化)同时发生,所以如果我在集合中有3个用户并使用此按钮,那么这三个用户将被保存。第四个将被保存,如果我再次推它创建第五个用户。。。 我假设这是由于存在两个线程:如何使保存线程等待新窗口关闭 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
NewUserGUI dodana = new NewUserGUI ();
dodana.setVisible(true);
User tempUser= new User();
tempUser= dodana.getUser();
listOfUsers.add(tempUser);
}
});
{
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("users.obiekt"));
out.writeObject(listOfUsers);
out.close();
} catch (IOException i) {
i.printStackTrace();
}
}
}
由于您已经在EDT上,使用EventQueue.invokeLater(…)调用此代码没有多大意义。这样做是在安排将用户添加到事件队列中,所以在持久化列表之后很可能会以这种方式调用它。接下来,您可能希望等待帧关闭,以获取新用户的数据。因此,请使用适当的侦听器:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
final JFrame dodana = new NewUserGUI();
dodana.addWindowListener(new WindowAdapter() {
@Override
public void windowDeactivated(WindowEvent e) {
User tempUser = dodana.getUser();
listOfUsers.add(tempUser);
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("users.obiekt"));
out.writeObject(listOfUsers);
out.close();
} catch (IOException i) {
i.printStackTrace();
}
}
});
dodana.setVisible(true);
}
嗯,好像不起作用了。。。它从不调用methid WindowClosing它在我的测试中起作用。您能分享一下NewUserGUI源代码吗?它是标准的jFrame,只有几个文本字段和一个按钮:private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){String nazwa=zNazwa.getText();int wiek=Integer.parseInt(zWiek.getText());int waga=Integer.parseInt(zWaga.getText());double wzrost=double.parseDouble(zWzrost.getText())/100;tempUser.ustawDaneUzytkownika(wzrost,wiek,waga,nazwa);setVisible(false);}看起来你没有关闭框架,只是隐藏了它。没问题,我们只需要使用不同的适配器方法。请尝试从答案中更新代码。