0

我想使用按钮。在接受信息窗口关闭后,它将调用我想在其中收集有关新用户的数据的 jFrame。现在我想将用户集合保存到文件中。问题是:两个事件(新窗口和序列化)同时发生,所以如果我有 3 个用户在集合中并使用此按钮,那么这三个将被保存。如果我再次推送它以创建第五个用户,第四个将被保存...我认为这是由于存在 2 个线程:如何让保存线程等到新窗口关闭?

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


    }

     }
}                              
4

1 回答 1

0

由于您已经在 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);
}
于 2013-08-31T17:54:39.750 回答