Java JFileChooser-存储用户选择的文件

Java JFileChooser-存储用户选择的文件,java,swing,nullpointerexception,jfilechooser,Java,Swing,Nullpointerexception,Jfilechooser,我在和Swing一起工作。我想抓取用户选择的文件,并在用户按下计数按钮时使用它们来计数。然而,当我按下按钮时,即使我选择了文件,也会出现空指针。如何让它工作 class RefractiveGUIFrame extends JFrame { private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 200; private File[]

我在和Swing一起工作。我想抓取用户选择的文件,并在用户按下计数按钮时使用它们来计数。然而,当我按下按钮时,即使我选择了文件,也会出现空指针。如何让它工作

      class  RefractiveGUIFrame extends JFrame 
{

    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
    private File[] dataFiles;

    private Object[][] refractiveIndex = null;




    public RefractiveGUIFrame()
    {
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setLocationByPlatform(true);


        final JPanel northPanel = new JPanel();
        final JPanel westPanel = new JPanel();
        northPanel.setLayout(new GridLayout(2,3));
        westPanel.setLayout(new GridLayout(3,1));


    //create components northPanel
        final JButton fileBrowseButton = new JButton("Browse..");
        final JTextField fileTextField = new JTextField(100);
        final JButton directoryBrowseButton = new JButton("Browse..");
        final JTextField directoryTextField = new JTextField(100);
        final JRadioButton fileChooser = new JRadioButton ("Choose File..",false);
        final JRadioButton directoryChooser = new JRadioButton ("Choose Directory..",true);         

        //resposible for turning off the previously set button
        ButtonGroup group = new ButtonGroup();
        group.add(fileChooser);
        group.add(directoryChooser);

        //set browse button off
        fileBrowseButton.setEnabled(false);
        directoryBrowseButton.setEnabled(true);

    //create components westPanel
        final JButton countButton = new JButton ("Count");
        final JButton displayButton = new JButton ("Display");
        final JButton saveButton = new JButton ("Save");

    //add components northPanel         
        northPanel.add(directoryChooser);
        northPanel.add(fileTextField);          
        northPanel.add(directoryBrowseButton);
        northPanel.add(fileChooser);
        northPanel.add(directoryTextField);
        northPanel.add(fileBrowseButton);

    //add components westPanel
        westPanel.add(countButton);
        westPanel.add(displayButton);
        westPanel.add(saveButton);

    //add panels to frame
        this.add(northPanel, BorderLayout.NORTH);
        this.add(westPanel, BorderLayout.WEST);

    //create file dialog that will be used in listeners
        final JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(new File ("."));

    //add action listeners as anonymous innner classes


        fileChooser.addActionListener(new ActionListener()
        {           
            public void actionPerformed(ActionEvent e)
            {
                fileBrowseButton.setEnabled(true);
                directoryBrowseButton.setEnabled(false);

            }
        });

        directoryChooser.addActionListener(new ActionListener()
        {           
            public void actionPerformed(ActionEvent e)
            {
                fileBrowseButton.setEnabled(false);
                directoryBrowseButton.setEnabled(true);

            }
        });



        fileBrowseButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                int returnVal = chooser.showOpenDialog(northPanel);
                dataFiles = chooser.getSelectedFiles();
                String filename = chooser.getSelectedFile().getPath();
                fileTextField.setText(filename);
            }
        });


        directoryBrowseButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int returnVal = chooser.showOpenDialog(northPanel);     
                String filename = chooser.getSelectedFile().toString();
                fileTextField.setText(filename);
                dataFiles = chooser.getSelectedFile().listFiles();
                for (File f : dataFiles)
                    System.out.println(f);


            }
        });

        countButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try{
                    for (int i =0; i<dataFiles.length;i++)
                    {
                        RefractiveIndex ri = new RefractiveIndex(dataFiles[i]);
                        refractiveIndex[i][i] = ri;
                        System.out.println("Refractive index value : " + ri.rii.toString());
                    }
                }
                catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
            }); //end countButton actionListener
        }
}
现在我有一个错误

      java.lang.NullPointerException
at com.refractiveindex.RefractiveGUIFrame$6.actionPerformed(RefractiveGUITest.java:230)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
我认为这是折射指数类的错误。你也这么认为吗?我想调试它,但我不知道如何进入类内部并在RefractiveIndex类中调试

我添加折射索引类。也许这会有帮助,因为我不知道如何解决它。实际上,当我运行它时,它会打印出
System.out.println(entry.getKey())
行,但我不知道它在哪里停止,为什么停止

public class RefractiveIndex {

public static Double sumRaMw = 0.0; 
public static Double sumMw = 0.0;
public static Double sumPsvMw = 0.0; 
public static Double rii;
File f = new File  ("DATA.txt");


//public static void main(String[] args) throws Exception {
    //String f = "DATA.txt";
    //String fasta = "3LWK.fasta.txt";
    //HashMap<String,ArrayList<Double>> myMap = readDataFromTxt(f);
    //System.out.println(myMap.keySet());
    //System.out.println(myMap.values());
    //System.out.println(myMap.get("PHE"));
    //ArrayList<ProteinSequence> seq = new ArrayList<ProteinSequence>();
    //seq = getProteinSequenceFromFasta(fasta);
    //Double refractive = calculateRefractive(myMap, seq);
    //System.out.println(refractive.toString());

//}

public RefractiveIndex(File fastaFile) throws Exception{
    HashMap<String,ArrayList<Double>> DataMap = readDataFromTxt(f);
    //HashMap<String,ArrayList<Double>> myMap = readDataFromTxt(fastaFile);
    ArrayList<ProteinSequence> seq = new ArrayList<ProteinSequence>();
    seq = getProteinSequenceFromFasta(fastaFile.getAbsolutePath());
    Double refractive = calculateRefractive(DataMap, seq);

}
public static HashMap<String,ArrayList<Double>> readDataFromTxt (File fileName) throws NumberFormatException, IOException
{
    HashMap<String, ArrayList<Double>> map = new HashMap<String, ArrayList<Double>>();


    FileReader fr = new FileReader(fileName); //read characters
    BufferedReader br = new BufferedReader (fr); //read line
    String line;
    while ((line = br.readLine())!=null)
    {
        ArrayList<Double> values = new ArrayList<Double>();
        String parts[] = line.split("\t");
        values.add(Double.parseDouble(parts[3]));
        values.add(Double.parseDouble(parts[4]));
        values.add(Double.parseDouble(parts[2]));
        String key = parts[1];


        map.put(key, values);


    }
    return map;
}

public static Double calculateRefractive (HashMap<String, ArrayList<Double>> hm, ArrayList<ProteinSequence> seq)
{
    for (ProteinSequence s : seq){
        List<AminoAcidCompound> compound = s.getAsList();
        for (int i =0;i<compound.size();i++){
            ArrayList<Double> temp = hm.get(compound.get(i).toString());
            sumMw += temp.get(0);
            //System.out.println(sumMw.toString());
            sumRaMw += temp.get(1)*temp.get(0);
            //System.out.println(temp.get(2));
            sumPsvMw +=temp.get(2)*temp.get(0);
            }
    }
    Double rp = sumRaMw/sumMw;
    Double vp = sumPsvMw/sumMw;
    Double np = Math.sqrt((2 * rp + vp)/(vp - rp));
    Double no = 1.3340 + (1.3325 - 1.3330);
    rii = 1.5 * vp * no * (np * np - no * no)/(np * np + 2 * no * no);
    return rii;

}

public static ArrayList<ProteinSequence> getProteinSequenceFromFasta(String file) throws Exception{

    LinkedHashMap<String, ProteinSequence> a = FastaReaderHelper.readFastaProteinSequence(new File(file));
    ArrayList<ProteinSequence> sequence =  new ArrayList<ProteinSequence>(a.values());
    for (Map.Entry<String, ProteinSequence> entry : a.entrySet()){
        System.out.println(entry.getKey());
    }
    return sequence;

}
公共类折射索引{
公共静态双sumRaMw=0.0;
公共静态双加W=0.0;
公共静态双槽PSVMW=0.0;
公共静态双rii;
文件f=新文件(“DATA.txt”);
//公共静态void main(字符串[]args)引发异常{
//字符串f=“DATA.txt”;
//字符串fasta=“3LWK.fasta.txt”;
//HashMap myMap=readDataFromTxt(f);
//System.out.println(myMap.keySet());
//System.out.println(myMap.values());
//System.out.println(myMap.get(“PHE”);
//ArrayList seq=新的ArrayList();
//seq=getProteinSequenceFromFasta(fasta);
//双折射=计算折射(myMap,seq);
//System.out.println(reflective.toString());
//}
公共折射索引(文件fastaFile)引发异常{
HashMap DataMap=readDataFromTxt(f);
//HashMap myMap=readDataFromTxt(fastaFile);
ArrayList seq=新的ArrayList();
seq=getProteinSequenceFromFasta(fastaFile.getAbsolutePath());
双折射率=计算折射率(数据图,序号);
}
公共静态HashMap readDataFromTxt(文件名)引发NumberFormatException,IOException
{
HashMap=newHashMap();
FileReader fr=新的FileReader(文件名);//读取字符
BufferedReader br=新的BufferedReader(fr);//读取行
弦线;
而((line=br.readLine())!=null)
{
ArrayList值=新的ArrayList();
字符串部分[]=行分割(“\t”);
add(Double.parseDouble(parts[3]);
add(Double.parseDouble(parts[4]);
add(Double.parseDouble(parts[2]);
字符串键=部件[1];
map.put(键、值);
}
返回图;
}
公共静态双计算折衷(HashMap hm,ArrayList seq)
{
用于(蛋白质序列s:seq){
List component=s.getAsList();

对于(int i=0;i,在我看来,
directoryBrowseButton
ActionListener
在单击浏览按钮并且没有选定的文件(尚未)时被触发。然后,当您触发计数按钮时,
dataFiles
为空

您应该侦听处理文件浏览器中项目选择的事件,并将其指定给数据文件

chooser.addPropertyChangeListener(new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent evt) {
       if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(
               evt.getPropertyName())) {
           JFileChooser chooser = (JFileChooser)evt.getSource();
           dataFiles = (File[])evt.getNewValue();
       }
    }
});

此行有多个标记-无法将PropertyChangeListener解析为类型-类型容器中的方法addPropertyChangeListener(PropertyChangeListener)不适用于参数(新PropertyChangeListener(){})是否缺少导入,即导入
java.beans.PropertyChangeListener
?Javadoc for java 6.0在与for的第行仍然为空指针(int i=0;我通过在
propertyChange
方法的if语句中设置断点来调试它,并查看它是否被命中,以及
dataFiles
是否被分配。
NullPointerException
被抛出到一个匿名类中(
ActionListener
实现)在第230行的
RefractiveGUITest
类中使用IDE(Eclipse?)在该行设置断点,或设置
NullPointerException
breakpoint。此外,您可以查看
dataFiles
以查看它是否被修改。有关Java应用程序调试的一些信息。我知道它位于第230行。我知道当我的断点位于230,并按F5时,调试过程停止(找不到源代码)这就是为什么我想进入RefractiveIndex类源代码,我不知道为什么我没有找到源代码。你确认了
数据文件[I]
包含
文件吗
RefractiveIndex类似乎是非标准的,所以我不能帮你。我确认数据文件[I]是我想要传递给RefractiveIndex类的文件
chooser.addPropertyChangeListener(new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent evt) {
       if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(
               evt.getPropertyName())) {
           JFileChooser chooser = (JFileChooser)evt.getSource();
           dataFiles = (File[])evt.getNewValue();
       }
    }
});