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

时间:2018-05-18 18:40:19

标签: java swing jfilechooser invokeandwait

我正在编写一个打开服务器套接字的线程代码,当连接到达时会要求用户选择一个目录。 我尝试过使用InvokeLater()并且它可以工作,但我无法控制何时检索所选的文件目录,因此InvokeAndWait看起来是正确的选择。除了它实际上没有做任何事情,我甚至尝试过将它作为println并且它似乎没有执行任何操作。 我如何解决它?我的想法已经不多了。 谢谢!

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();
        }
    }

}

}

1 个答案:

答案 0 :(得分:0)

它是一个僵局

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

这里发生的是:

  1. SwingUtilities.invokeAndWait向EDT提交任务 - 阻止任务完成
  2. dirChooser.showOpenDialog(null);时间表对话框绘制到EDT - 等待unitl对话框关闭 - 但它从未被绘制....
  3. 由于invokaAndWait等待在EDT上完成 - 事件队列没有被清空,任务等待自己完成 - 死锁
  4. 你应该做的是直接在没有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());
    }