我需要一些帮助,我有一个方法,当点击一个按钮时执行,然后这个方法打开一个新窗口,更新另一个类中的变量,然后该方法从类中获取该变量然后使用它。
加载的窗口是空白的,似乎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");
}
}
答案 0 :(得分:2)
是的,的确如此。等待事件调度线程使其完全阻塞,从而防止任何重绘发生。所以在你等待的时候,EDT不能再画任何东西了。
不应在事件派发线程中完成长时间运行的任务,甚至更多阻塞任务。目前尚不清楚为什么你在这里使用wait()
BTW。
捕捉异常并完全忽略它是你可以做的最糟糕的事情之一。
答案 1 :(得分:2)
您正在屏蔽Event Dispatch Thread。如果不允许EDT移过wait
调用,则不会处理任何事件,这意味着无法绘制任何内容。
请尝试使用modal dialog,而不是使用新窗口。模态对话框阻止对其他顶级组件的所有访问(取决于模态类型),直到它们被妥善处理。
答案 2 :(得分:0)
你不能这样做,因为Swing只在一个线程上运行!您需要在等待之后将正在执行的处理移动到您正在创建的窗口中。你不能等待。
这是一份很好的文件:
答案 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。