首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwingUtilities.InvokeAndWait()不执行可运行代码

SwingUtilities.InvokeAndWait()不执行可运行代码
EN

Stack Overflow用户
提问于 2018-05-19 02:40:19
回答 1查看 373关注 0票数 0

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

代码语言:javascript
复制
public class FileTransfListener implements Runnable {

protected JFileChooser dirChooser;

public FileTransfListener(JFileChooser f){
    dirChooser=f;
}

@Override
public void run() {
    ServerSocket serverSocket = null;
    Socket socket = null;
    BufferedReader in = null;
    BufferedWriter out = null;
    try {
        serverSocket = new ServerSocket(60905);
    } catch (IOException e1) {
        return;
    }
    while(true){
        try {
            socket = serverSocket.accept();
            String dir=null;

            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    dirChooser.showOpenDialog(null);
                }
            });

            try{
                dir= dirChooser.getSelectedFile().getAbsolutePath();
            }
            catch(NullPointerException e){
                dir=null;
            }
            System.out.println(dir);
            }
            catch (IOException  ex) {
            ex.printStackTrace();
            try {
                serverSocket.close();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        } catch (InvocationTargetException |InterruptedException e1) {
            e1.printStackTrace();
        }
    }

}

}

EN

回答 1

Stack Overflow用户

发布于 2018-05-19 02:49:55

这是一个死结

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

这里发生的情况是:

  1. SwingUtilities.invokeAndWait将任务提交到EDT - blocks,直到它完成计划对话框draw to EDT - awaits对话框关闭-但它的never drawn....
  2. Since invokaAndWait awaits on EDT等待完成-事件队列不为空,任务等待自身完成- deadlock

您应该做的是直接呼叫而不使用EDT队列。文档中有一个简单的例子:

代码语言:javascript
复制
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());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50417446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档