我的JFileChooser第二次使用它时不起作用

时间:2014-11-03 00:00:03

标签: java swing file-io jfilechooser

所以,我试图调用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);
    }
}

}

1 个答案:

答案 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;
    }

    ...
}