我正在编写一个线程代码,它打开一个服务器套接字,当连接到达时,它会要求用户选择一个目录。我尝试过使用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();
}
}
}}
发布于 2018-05-19 02:49:55
这是一个死结
dirChooser.showOpenDialog(null);是一种阻塞方法,您应该直接使用它,而不是通过SwingUtilities
这里发生的情况是:
SwingUtilities.invokeAndWait将任务提交到EDT - blocks,直到它完成计划对话框draw to EDT - awaits对话框关闭-但它的never drawn....invokaAndWait awaits on EDT等待完成-事件队列不为空,任务等待自身完成- deadlock您应该做的是直接呼叫而不使用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());
}https://stackoverflow.com/questions/50417446
复制相似问题