如何拒绝使用JFileChooser选择相同的文件

时间:2012-04-07 13:26:16

标签: java swing jfilechooser jtabbedpane multiple-files

我正在创建程序,其功能是读取“n”.txt或.java文件以及这些文件创建UML图。我有阅读方法,但我遇到了加载更多相同文件的问题。我想拒绝加载相同的文件,因为它会产生创建UML图的问题。

我试图解决它,以便将上传的文件存储到ArrayList中,并使用保存在ArrayList中的文件检查每个加载文件,其中包含以前加载的文件。

接下来的问题是当我选择相同的文件时,我点击按钮是或否,文件同样加载。

当我创建这个答案时,我发现了下一个问题。当用户选择多个文件时,ArrayList不知道如何一次添加两个文件。

有没有人可以选择如何更轻松地解决这个问题?

ArrayList<String> filenames = new ArrayList<String>();
JTabbedPane tabbedPaneUML_Files = new JTabbedPane();

private void readFiles() {
    JFileChooser fc = new JFileChooser();
    fc.setMultiSelectionEnabled(true);
    FileNameExtensionFilter fileFilter =
            new FileNameExtensionFilter("Only .txt a .java files",
            "txt", "java");
    fc.setFileFilter(fileFilter);
    int returnValue = fc.showOpenDialog(this);        

    if (returnValue == JFileChooser.APPROVE_OPTION) {
        File[] files = fc.getSelectedFiles();
        File file;            
        tabbedPaneUML_Files.addTab("UML diagram", panelUML);

        for (int i = 0; i < files.length; i++) {
            file = files[i];

            for (int j = 0; j < filenames.size(); j++) {
                if (filenames.get(i).equals(fc.getSelectedFile().getName())) {
                    Object[] options = {"Yes", "No"};

                    int answer = JOptionPane.showOptionDialog(this,
                            "Unable to load the same files! To retrieve the other files?",
                            "Load new file", JOptionPane.YES_NO_OPTION,
                            JOptionPane.WARNING_MESSAGE, null, options, options[0]);     

                    if(answer == 0) {
                        readFiles();
                    }
                }
            }         
            filenames.add(file.getName());
            JTextArea loadCode = new JTextArea();
            JScrollPane scrollingFile = new JScrollPane();
            scrollingFile.setViewportView(loadCode);
            tabbedPaneUML_Files.addTab("" + file.getName(), scrollingFile);
            int ch;

            try {
                Reader charsReader =
                        new InputStreamReader(new FileInputStream(file),
                        "UTF-8");

                while ((ch = charsReader.read()) != -1) {
                    loadCode.append(Character.toString((char) ch));
                }
                loadCode.setSelectionStart(0);
                loadCode.setSelectionEnd(0);
                loadCode.setEditable(false);
            } catch (FileNotFoundException ex) {
                Logger.getLogger(HlavniOkno.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(HlavniOkno.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

感谢您的任何建议。我已经失去了想法。 抱歉我的英文。

1 个答案:

答案 0 :(得分:1)

您可以使用找到的here

的validatedFileChooser

并调整它,以便拥有已选择文件的列表,而不是拥有无效文件名列表。 然后你可以编辑这个部分:

if (file.exists() && getDialogType() == SAVE_DIALOG) {
int confirm = JOptionPane.showConfirmDialog( this, file.getName() + " already exists! Would you like to overwrite it?", "File already exists", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE );
if (confirm != JOptionPane.YES_OPTION)
return;
}

getDialogType() == LOAD_DIALOG并且错误消息为:“文件已经加载”,例如。

对于多个文件名,请File[] files = chooser.getSelectedFiles();获取所选文件列表,迭代它们以获取其名称,然后将它们存储在已选择文件名的数组中。

编辑 - 抱歉看到您已经完成了File[] files = chooser.getSelectedFiles();,所以您需要做的就是将其添加到包含已加载文件名的数组中。