0

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

加载的窗口是空白的,似乎 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");
    }

}  
4

6 回答 6

2

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

长时间运行的任务,甚至更多的阻塞任务,都不应该在事件调度线程中完成。wait()顺便说一句,根本不清楚你为什么在这里使用。

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

于 2012-07-09T21:05:09.530 回答
2

您正在阻止Event Dispatch Thread。通过不允许 EDT 跳过wait调用,无法处理任何事件,这意味着无法绘制任何内容。

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

于 2012-07-09T21:05:25.887 回答
0

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

这是一个很好的阅读文档:

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

于 2012-07-09T21:04:12.983 回答
0

wait 方法继承自 Object() 和文档状态

使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。换句话说,此方法的行为与它只是执行调用 wait(0) 完全相同。

因此,你必须给它一些等待的东西,但是当你阻塞唯一的线程时,它不可能同时绘制一些东西。

于 2012-07-09T21:06:57.207 回答
0

您的目标是在您的主 JFrame 中等待,直到用户在另一个 JFrame 中输入您需要的数据吗?如果那是您的目标,请查看 Dialog ModalityTypes。

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

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

super(parentDialog, Dialog.ModalityType.DOCUMENT_MODAL);

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

希望有帮助。

于 2012-07-09T21:07:55.543 回答
0

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

于 2012-07-09T21:23:02.387 回答