通过JFrame选择文件并将pathToFile返回到主类

时间:2015-12-12 22:44:23

标签: java jframe

我正在尝试创建一个简单的表单,它允许用户选择一个文件然后我想在主类中使用这个文件。但我有一个错误“从内部类访问可变帧”。好吧,我已经读过我必须做一个变量final,这给了我“无法为最终变量'frame'赋值”,这是正确的。再次读取stackoverflow,我发现我必须在主程序之前放置定义变量。但在这里我堆叠 - 我不认为这是一个很好的解决方案,因为我从来没有看到任何代码示例以这种方式定义变量。我仍然试过并得到错误。

public class HelloWorld {
//ExcelChooseFileFrame frame;
public static void main(String[] args)  {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
final ExcelChooseFileFrame frame;
        public void run() {
            JFrame.setDefaultLookAndFeelDecorated(true);
            JDialog.setDefaultLookAndFeelDecorated(true);
            frame = new ExcelChooseFileFrame();//Cannot assign a value to final variable 'frame'
        }
    });
}

ExcelChooseFileFrame

public class ExcelChooseFileFrame  extends JFrame {
File file;
public ExcelChooseFileFrame(){
    super("Choose excel");

                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel panel = new JPanel();
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

                panel.add(Box.createVerticalGlue());

                final JLabel label = new JLabel("Choosed file");
                label.setAlignmentX(CENTER_ALIGNMENT);
                panel.add(label);

                panel.add(Box.createRigidArea(new Dimension(10, 10)));

                JButton button = new JButton("Show JFileChooser");
                button.setAlignmentX(CENTER_ALIGNMENT);

                button.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        JFileChooser fileopen = new JFileChooser();
                        int ret = fileopen.showDialog(null, "Open file");
                        if (ret == JFileChooser.APPROVE_OPTION) {
                            file = fileopen.getSelectedFile();
//                                System.out.println(file.getPath());
                            setVisible(false);
                            dispose();
            }
        }
    });

    panel.add(button);
    panel.add(Box.createVerticalGlue());
    getContentPane().add(panel);

    setPreferredSize(new Dimension(260, 220));
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
}
public String getPathToFile() {
    return file.getPath();
}
}

我知道这是一项非常简单的任务,但是我花了几个小时试图解决它仍然没有成功。请指点我如何从main获取框架或文件对象。 谢谢!

1 个答案:

答案 0 :(得分:0)

HelloWorld中,在声明它的行上初始化变量:

public final ExcelChooseFileFrame frame = new ExcelChooseFileFrame()

然后消除代码中的赋值。如果你希望从包之外的其他类中引用它,它只需要公开。