新窗口无法加载

时间:2012-07-09 20:57:59

标签: java wait

我需要一些帮助,我有一个方法,当点击一个按钮时执行,然后这个方法打开一个新窗口,更新另一个类中的变量,然后该方法从类中获取该变量然后使用它。

加载的窗口是空白的,似乎wait()函数在加载新窗口之前导致线程停止。

private void autoFillUsersActionPerformed(java.awt.event.ActionEvent evt) {                                              
    publicLesson pL= new publicLesson();
    new dateSelect().setVisible(true);
    try{
        synchronized(this){
            this.wait();
        }
    }
    catch(Exception e){

    }
  int var= pL.getAmount();
  System.out.println("var ="+var);

    DefaultTableModel defaultModel = (DefaultTableModel) pupilTable.getModel();
    for (int i = 0; i <= (userCountAmount - 1); i++) {
        defaultModel.setValueAt(var, 5, i);
        System.out.println("BeingSet");
    }

}  

6 个答案:

答案 0 :(得分:2)

是的,的确如此。等待事件调度线程使其完全阻塞,从而防止任何重绘发生。所以在你等待的时候,EDT不能再画任何东西了。

不应在事件派发线程中完成长时间运行的任务,甚至更多阻塞任务。目前尚不清楚为什么你在这里使用wait() BTW。

捕捉异常并完全忽略它是你可以做的最糟糕的事情之一。

答案 1 :(得分:2)

您正在屏蔽Event Dispatch Thread。如果不允许EDT移过wait调用,则不会处理任何事件,这意味着无法绘制任何内容。

请尝试使用modal dialog,而不是使用新窗口。模态对话框阻止对其他顶级组件的所有访问(取决于模态类型),直到它们被妥善处理。

答案 2 :(得分:0)

你不能这样做,因为Swing只在一个线程上运行!您需要在等待之后将正在执行的处理移动到您正在创建的窗口中。你不能等待。

这是一份很好的文件:

http://www.javapractices.com/topic/TopicAction.do?Id=153

答案 3 :(得分:0)

wait方法继承自Object()和the docs state

  

导致当前线程等待,直到另一个线程调用   notify()方法或此对象的notifyAll()方法。其他   单词,此方法的行为就像它只是执行调用一样   等待(0)。

因此,你必须给它一些等待的东西,但是当你阻止唯一的线程时,它无法在同时描绘一些东西。

答案 4 :(得分:0)

在用户在另一个JFrame中输入您需要的数据之前,您的目标是在主JFrame中等待吗? 如果那样你的目标只是看看Dialog ModalityTypes。

http://download.java.net/jdk7/archive/b123/docs/api/java/awt/Dialog.ModalityType.html

构造新的Dialog时,只需将父对话框作为构造函数的参数,然后调用

super(parentDialog, Dialog.ModalityType.DOCUMENT_MODAL);

然后你的主JFrame将等待你的新JDialog关闭,直到它运行其余的函数。

希望有所帮助。

答案 5 :(得分:0)

我同意一些答案:删除try / catch / synchronized块并使用javax.swing.JDialog接收用户输入。 请参阅官方Swing文档,它提供了足够好的示例, 即关于JDialog的这一http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html