值不存储在变量中

时间:2014-02-20 06:32:54

标签: java jfilechooser

这是一个使用JFileChooser的程序:

package execute;

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class FCDemo extends JFrame
{
    JFileChooser fc = new JFileChooser();
    private String fileName;

    public FCDemo(String title)
    {
        super(title);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel pnl = new JPanel();
        pnl.setLayout(new GridLayout(2, 1));

        JButton btn = new JButton("JFileChooser.showOpenDialog() Demo");
        ActionListener al;
        al = new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                switch (fc.showOpenDialog(FCDemo.this))
                {
                case JFileChooser.APPROVE_OPTION:
                    fileName=fc.getSelectedFile().getName();
                    JOptionPane.showMessageDialog(FCDemo.this, "Selected: "+fc.getSelectedFile(),"FCDemo",JOptionPane.OK_OPTION);
                    break;

                case JFileChooser.CANCEL_OPTION:
                    JOptionPane.showMessageDialog(FCDemo.this, "Cancelled","FCDemo",JOptionPane.OK_OPTION);
                    break;

                case JFileChooser.ERROR_OPTION:
                    JOptionPane.showMessageDialog(FCDemo.this, "Error","FCDemo",JOptionPane.OK_OPTION);
                }

            }   
        };
        btn.addActionListener(al);
        pnl.add(btn);

        setContentPane(pnl);

        pack();
        setVisible(true);
    }

    public String get_fileName(){
        return fileName;
    }


    public static void main(String[] args)
    {

        FCDemo demo=new FCDemo("filechooser");
        System.out.println("the file name is= "+demo.get_fileName());
    }
}

由于某种原因,所选文件的目录未存储在名为fileName的字符串变量中。当我将fileName打印到控制台时,我得到null 任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

文件名存储正确。在初始JFrame中按下按钮之前,请尝试观察控制台。在您看到FileChooser之前输出发生。很可能Swing使用额外的Thread来绘制UI。在绘制JFrame时,输出会并行打印。

答案 1 :(得分:1)

在选择文件之前执行主线程。这就是为什么文件名被打印为null的原因。要查看所选文件,请尝试将主线程休眠10秒钟。并选择你的文件。之后,您可以在main中看到所选文件。 使用:

public static void main(String[] args)
{
    FCDemo demo=new FCDemo("filechooser");
    try {
          Thread.sleep(10000);
    } catch (Exception e) {
        // TODO: handle exception
    }
    System.out.println("the file name is= "+demo.get_fileName());
}