所以,我试图调用getFile()来打开一个JFileChooser。它在第一次被调用时工作,但不是第二次。
我有一段时间(!done)循环充当我的主菜单中的一个菜单,其中一个选项获取文件并对其执行某些操作。它第一次工作正常,但是第二次尝试从菜单中执行时它会卡在if(returnVal == JFileChooser.APPROVE_OPTION)
。更奇怪的是,当我调试该行时,它会多次工作。我也很肯定对话框第二次没有隐藏在某个地方。我能找到的唯一怀疑是事件发送线程正在发生的事情,但这超出了我的理解水平。所以,我想我从根本上误解了一些关于JFileChoosers的事情?
public void getFile()
throws FileNotFoundException, IOException
{
JFileChooser myChooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("txt files", "txt");
myChooser.setFileFilter(filter);
int returnVal = myChooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
File myFile=myChooser.getSelectedFile();
this.myFile=myFile;
String tempFileName= myFile.getName();
fileName= tempFileName.substring(0, (tempFileName.length()-4));
System.out.println("File Picked: " +fileName);
this.fileName=fileName;
}
}
编辑:
好的,这是重现问题的方法:
测试仪:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class Test {
public static void main(String[] args)
throws FileNotFoundException, IOException
{
Scanner myScanner = new Scanner(System.in);
boolean done = false;
while (!done)
{ System.out.println("");
System.out.println("1 - GetFile");
System.out.println("2 - Exit");
int choice= Integer.parseInt(myScanner.nextLine());
if (choice ==1)
{ System.out.println("GetFile ");
Chooser myChooser=new Chooser();
myChooser.getFile();
System.out.println("done");
}
else if( choice ==2)
{ System.out.println("Good Bye"); done=true;}
else System.out.println("Invalid choice");
} while (!done);
System.exit(0);
}
}
程序:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.JFileChooser;
public class Chooser {
public void getFile()
throws FileNotFoundException, IOException
{
JFileChooser myChooser = new JFileChooser();
int returnVal = myChooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("loop marker");
File myFile=myChooser.getSelectedFile();
String tempFileName= myFile.getName();
System.out.println("File Picked: " +tempFileName);
}
}
}
答案 0 :(得分:0)
我无法重现您的具体问题。该代码适合我;然而,它仍然被打破,因为从主线程使用Swing组件是错误的。
尝试在执行任何其他操作之前切换到事件调度线程(不幸的是,您需要重新抛出的异常会使这更加混乱):
public static void main(final String[] args) throws FileNotFoundException, IOException {
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
main(args);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
return;
}
...
}