java - 我是否重载了我的actionListener?文件选择器

标签 java actionlistener jfilechooser

我正在尝试使用 actionListener 从 JFileChooser 加载已保存的文件。这是一段代码。

class chooserListener implements ActionListener{
            public void actionPerformed (ActionEvent e)
            {   
                if (e.getSource() instanceof JFileChooser){
                    JFileChooser openFile = (JFileChooser)e.getSource();
                    String command = e.getActionCommand();
                    if (command.equals(JFileChooser.APPROVE_SELECTION)){
                        File selectedFile = openFile.getSelectedFile();

                        loadSavedGame(selectedFile);
                        System.out.print("clicked open file");
                        tp.setSelectedIndex(0);
                    }
                    else if (command.equals(JFileChooser.CANCEL_SELECTION)) {
                          System.out.print("tester");
                          tp.setSelectedIndex(0);
                    }
                }
            }
        }
chooser.addActionListener(new chooserListener());

public void loadSavedGame(File loadfile) {

        int allCells = countCells(loadfile);
        setMineGame(allCells);

        try {
            Scanner loadFile = new Scanner(loadfile);
            while (loadFile.hasNextInt()){
                for (int i = 0; i < allCells; i++){
                    mineGame.setCell(i, loadFile.nextInt());
                    //System.out.print("loading saved game");  
                }
                loadFile.close();
                mineGame.repaint();
                tp.setSelectedIndex(0);
            }
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

private int countCells(File countCell) {

    int cellCount = 0;

    try {
        Scanner getCells = new Scanner(countCell);
        while (getCells.hasNextInt()){
            cellCount++;

        }
        getCells.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.print(cellCount);
    return cellCount;
}

public void setMineGame(int cells) {
    game.removeAll();
    mineGame.setDifficulty(cells);
    mineGame = new Board(statusbar, difficulty);
    game.add(mineGame, BorderLayout.CENTER);
    game.add(statusbar, BorderLayout.SOUTH);

    frame.validate();
    frame.repaint();

}   
public void setDifficulty(int cells){

        if(cells == 256){
            difficulty = 0;
        }
        if (cells == 676){
            difficulty = 1;
        }
        else difficulty = 2;
    }

我觉得 Action 监听器有太多方法要做。当我单击“打开”时,它挂起,并且测试打印行“System.out.print(“单击打开文件”);'不打印。我的其余代码非常大,我不知道如何进行 SSCE(?)。我想知道是否有人能明白为什么我的 actionListener 挂起?谢谢IA

最佳答案

看起来像loadSavedGame(File file)需要很多时间来执行。由于此方法运行在 Event Dispatch Thread你感觉你的程序挂起并且永远不会到达 System.out.print("clicked open file");线。我将开始在单独的测试用例中测试此方法的响应时间

无论如何,我建议你一些提示:

1) 请注意,无需实现 ActionListener做你的代码。你可以简单地做到这一点:

JFileChooser chooser = new JFileChooser();
int returnValue = chooser.showOpenDialog(null);
if(returnValue == JFileChooser.APPROVE_OPTION){
    //make stuff if approved
} else if(returnValue == JFileChooser.CANCEL_OPTION){
    //make stuff if canceled
}

我认为它让人们的生活更轻松。

2) 另一方面,请注意您有两个 I/O 操作:通过 countCells(File countCell) 获取单元格计数方法并将细胞本身放入loadSavedGame(File loadfile)方法。您可以更好地只读取一次文件:

public List<Integer> getCells(File file){
    List<Integer> list = new ArrayList<>();
    try {    
        Scanner getCells = new Scanner(file);
        while (getCells.hasNextInt()){
            list.add(Integer.valueOf(getCells.nextInt()));

        }
        getCells.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
          return list;
    }
}

并在 loadSavedGame 中进行此更改方法:

public void loadSavedGame(File loadfile) {

    List<Integer> allCells = getCells(loadfile);
    setMineGame(allCells.size());
    int index = 0;

    for(Integer value : allCells){
        mineGame.setCell(index, value);
        index++;
    }

    mineGame.repaint();
    tp.setSelectedIndex(0);
}

关于java - 我是否重载了我的actionListener?文件选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19492647/

相关文章:

java - 在Java中设置文件创建时间戳

java - Java 中的 Windows native 文件选择器

java - Double 的 Eclipse 错误

java - 动态编译不创建物理文件

java - 无法单击 Selenium Webdriver 中的元素

java - 如何让图形消失?

java - JMenu 上的 Actionlistener 不工作

java - 在actionPerformed()方法中创建一个新的JFrame,然后我如何使用这个JFrame的JButton执行操作

java - 为什么我在 if 条件下遇到异常?

java - 创建文件并将其保存到动态存储