程序不等待模态对话

时间:2017-07-14 20:49:11

标签: jfilechooser

通过这个程序,我试图让用户选择一个代表4x4数独问题的文本文件。然后我的代理人将获取此文件并尝试解决数独难题。

我遇到的问题是,我似乎无法弄清楚如何选择正确的文件,然后传入方法调用进行处理。

这是我创建的文件选择器类。到目前为止,它成功地显示了一个按钮,点击后会显示计算机的文件结构,以便用户可以选择文件。

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

/**
 * Created by neil on 7/12/17.
 */
public class file_selector {
    public JPanel panel1;
    public File file;
    JButton button1;

    public file_selector() {
        final JFileChooser fc = new JFileChooser();
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int returnVal = fc.showOpenDialog(null);

                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    file = fc.getSelectedFile();
                    System.out.println("You chose to open " + file.getName());
                }

            }
        });
    }

    public File getFile() {
        return file;
    }
}

这是我尝试使用用户选择的文件的主要方法。当我将函数调用放在while循环中时(就像它当前一样)它永远不会继续,因为永远不会设置文件。如果我没有在while循环中放入函数调用,当我尝试处理文件时会收到nullPointerException错误,因为该文件的值为空。

public class sudoku {

//create 2d array that represents the 16x16 world
public cell[][] world_array = new cell[15][15];
static File myFile;
ArrayList<String> world_constraints;


public static void main(String[] args) throws IOException {

    JFrame frame = new JFrame("file_selector");
    file_selector fs = new file_selector();
    frame.setContentPane(fs.panel1);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

    myFile = fs.getFile();

    while(myFile != null) {
        sudoku my_puzzle = new sudoku();
        my_puzzle.solve_puzzle();
    }
}

我已经进行了大量的搜索,似乎无法找到我的file_selector类的错误,因此它没有为文件设置用户选择的值。

1 个答案:

答案 0 :(得分:0)

您在显示框架之后以及用户有机会点击任何内容之前立即致电getFile。由于while的条件为false,因此循环立即结束,之后方法不会执行任何操作,特别是它永远不会再次调用getFile

两个选项:

  1. 让按钮解决难题,而不只是设置file(更简单,只需更改actionPerformed方法)。

  2. 在选择文件时让file_selector发出事件并向其添加一个监听器(这对您来说可能是一个挑战)。