Java SwingUtilities.InvokeAndWait()不';t执行可运行的代码

Java SwingUtilities.InvokeAndWait()不';t执行可运行的代码,java,swing,jfilechooser,invokeandwait,Java,Swing,Jfilechooser,Invokeandwait,我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时,它会要求用户选择一个目录。 我尝试过使用InvokeLater(),它可以工作,但我无法控制何时检索选定的文件目录,因此InvokeAndWait看起来是正确的选择。除了它实际上什么都不做之外,我甚至试着给它一个println,它似乎什么都不执行。 我怎么修理它?我的点子快用完了。 谢谢 }这是一个僵局 dirChooser.showOpenDialog(空)是一种阻塞方法,您应该直接使用它,而不是通过SwingUtilities 这

我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时,它会要求用户选择一个目录。 我尝试过使用InvokeLater(),它可以工作,但我无法控制何时检索选定的文件目录,因此InvokeAndWait看起来是正确的选择。除了它实际上什么都不做之外,我甚至试着给它一个println,它似乎什么都不执行。 我怎么修理它?我的点子快用完了。 谢谢

}这是一个僵局

dirChooser.showOpenDialog(空)
是一种阻塞方法,您应该直接使用它,而不是通过
SwingUtilities

这里发生的是:

  • SwingUtilities.invokeAndWait
    将任务提交给EDT-blocks,直到任务完成
  • dirChooser.showOpenDialog(空)计划对话框绘制到EDT-等待unitl对话框关闭-但从未绘制
  • 由于
    invokaAndWait
    在EDT上等待完成-事件队列未清空,任务等待自身完成-死锁
  • 您应该做的是不使用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());
    }