Java SwingUtilities.InvokeAndWait()不';t执行可运行的代码
我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时,它会要求用户选择一个目录。 我尝试过使用InvokeLater(),它可以工作,但我无法控制何时检索选定的文件目录,因此InvokeAndWait看起来是正确的选择。除了它实际上什么都不做之外,我甚至试着给它一个println,它似乎什么都不执行。 我怎么修理它?我的点子快用完了。 谢谢 }这是一个僵局Java SwingUtilities.InvokeAndWait()不';t执行可运行的代码,java,swing,jfilechooser,invokeandwait,Java,Swing,Jfilechooser,Invokeandwait,我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时,它会要求用户选择一个目录。 我尝试过使用InvokeLater(),它可以工作,但我无法控制何时检索选定的文件目录,因此InvokeAndWait看起来是正确的选择。除了它实际上什么都不做之外,我甚至试着给它一个println,它似乎什么都不执行。 我怎么修理它?我的点子快用完了。 谢谢 }这是一个僵局 dirChooser.showOpenDialog(空)是一种阻塞方法,您应该直接使用它,而不是通过SwingUtilities 这
dirChooser.showOpenDialog(空)
是一种阻塞方法,您应该直接使用它,而不是通过SwingUtilities
这里发生的是:
SwingUtilities.invokeAndWait
将任务提交给EDT-blocks,直到任务完成dirChooser.showOpenDialog(空)代码>计划对话框绘制到EDT-等待unitl对话框关闭-但从未绘制
invokaAndWait
在EDT上等待完成-事件队列未清空,任务等待自身完成-死锁JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"JPG & GIF Images", "jpg", "gif");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(parent);
if(returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: " +
chooser.getSelectedFile().getName());
}
问题是:我得到org.pushingpixels.substance.api.UiThreadingViolationException:如果我直接使用showOpenDialog()在那一行上,组件创建必须在事件调度线程上完成抱歉,IDK pushpixels,那不是SWINGPut对话框调用的一部分,也不是EDT上的其余逻辑,但不是invoke和Wait,我得到了不一致的结果,首先,invokelater在只需显示对话框时工作良好,然后我尝试添加更多,它继续工作,我添加了更多(提交问题时忽略的套接字和bufferedreader/writer管理),它开始无所作为。现在,我还原代码,它仍然无所作为,我不知道你在说什么代码。更新问题-注释中的代码不可读(你看不出来吗?)\u所以,我做了一个非常快速的测试,看起来效果很好。这意味着有其他事情正在阻止对话框显示,例如另一个对话框已经打开或EDT中的某些其他阻止操作。我想到的问题是,为什么要在每个
Socket
连接上提示文件位置?是否在EDT的上下文中调用FileTransfListener#run
?
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"JPG & GIF Images", "jpg", "gif");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(parent);
if(returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: " +
chooser.getSelectedFile().getName());
}