SwingUtilities.InvokeAndWait () не выполняет исполняемый код - PullRequest
0 голосов
/ 18 мая 2018

Я пишу код потока, который открывает сокет сервера и который при достижении соединения запрашивает у пользователя выбор каталога.Я пытался использовать InvokeLater (), и он работает, но я не могу контролировать, когда извлекать выбранный каталог файлов, поэтому InvokeAndWait выглядел как правильная альтернатива.За исключением того, что он на самом деле ничего не делает, я даже пытался дать ему печать, и он, кажется, просто ничего не выполняет.Как мне это исправить?У меня заканчиваются идеи.Спасибо!

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 голосов
/ 18 мая 2018

Это тупик

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