我正在研究一个科学研究项目,而不是使用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;
}
}
答案 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()
结果的消息。