Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解决2窗口同步问题_Java_Swing_Synchronization_Jframe - Fatal编程技术网

Java 解决2窗口同步问题

Java 解决2窗口同步问题,java,swing,synchronization,jframe,Java,Swing,Synchronization,Jframe,我想用这个按钮。在接受信息窗口关闭后,它将调用jFrame,我想在其中收集有关新用户的数据。 现在我想将用户集合保存到文件中。问题是:两个事件(新窗口和序列化)同时发生,所以如果我在集合中有3个用户并使用此按钮,那么这三个用户将被保存。第四个将被保存,如果我再次推它创建第五个用户。。。 我假设这是由于存在两个线程:如何使保存线程等待新窗口关闭 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

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

 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);}看起来你没有关闭框架,只是隐藏了它。没问题,我们只需要使用不同的适配器方法。请尝试从答案中更新代码。