使用Java的FileChooser时遇到问题

时间:2015-03-03 23:02:34

标签: java

我正在研究一个科学研究项目,而不是使用Excel,我想用我自己的代码分析数据。我保存了一个' .txt' 文件,里面有10,000个数据点,由制表符和硬回车分隔。现在,我正在尝试使用这段代码来更好地选择要审核的文件,但它实际上从来没有让我使用getFile()发送文件,我的问题是:为什么它会永远循环而永远不会得到文件可供使用?

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class SimpleFileChooser extends JFrame {
    public File sf;
    public SimpleFileChooser() {
        super("File Selector");
        setSize(350, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        JButton openButton = new JButton("Open");
        final JLabel statusbar = new JLabel("Select a File");
        openButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();
                int option = chooser.showOpenDialog(SimpleFileChooser.this);
                if (option == JFileChooser.APPROVE_OPTION) {
                    sf = chooser.getSelectedFile();
                }
            }
        });
        c.add(openButton);
        c.add(statusbar);
    }

    public File getFile(){
        return sf;
    }
}

2 个答案:

答案 0 :(得分:2)

如果用户按下ActionListener,您正在使用openButton来触发文件选择。此侦听器不会阻止当前线程(操作事件在Event Dispatch Thread上运行),因此您可以完成SimpleFileChooser的实例化,然后在用户有机会之前调用#getFile()选择一个文件。

您可以在代码周围构建一些东西以使其等待动作事件发生,或者您可以摆脱该帧和侦听器,因为您不需要它们:

 public class SimpleFileChooser {
      private final JFileChooser chooser;

      public SimpleFileChooser() {
           chooser = new JFileChooser();
           chooser.setDialogTitle("Select a File");
      }

      public File getFile() {
           int option = chooser.showOpenDialog(null);
           if (option == JFileChooser.APPROVE_OPTION) {
                return chooser.getSelectedFile();
           }
           return null;
      }
 }

您可以像以前一样打电话:

SimpleFileChooser sfc = new SimpleFileChooser();
Trial test = new Trial(sfc.getFile());

由于您可以多次调用#getFile(),因此您应该重复使用SimpleFileChooser实例,因为它的创建非常昂贵。

答案 1 :(得分:0)

我不确定你是怎么称呼getFile()的。您确定始终使用SimpleFileChooser的同一个实例吗? 为了确保问题不是getSelectedFile()方法,我认为不是,您可以在更新了sf变量后立即显示包含sf.getName()结果的消息。