我正在编写一个打开服务器套接字的线程代码,当连接到达时会要求用户选择一个目录。 我尝试过使用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();
}
}
}
}
答案 0 :(得分:0)
它是一个僵局
dirChooser.showOpenDialog(null);
是一种阻止方法,你应该直接使用它而不是SwingUtilities
这里发生的是:
SwingUtilities.invokeAndWait
向EDT提交任务 - 阻止任务完成dirChooser.showOpenDialog(null);
时间表对话框绘制到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());
}