0

我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时要求用户选择一个目录。我已经尝试使用 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();
        }
    }

}

}

4

1 回答 1

0

这是一个僵局

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

这里发生的是:

  1. SwingUtilities.invokeAndWait向 EDT 提交任务 - 阻塞直到完成
  2. dirChooser.showOpenDialog(null);安排对话框绘制到 EDT - 等待 unitl 对话框关闭 - 但它从未绘制....
  3. 由于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());
}
于 2018-05-18T18:49:54.653 回答