0

「n」個の .txt または .java ファイルを読み取り、これらのファイルから UML ダイアグラムを作成する機能を持つプログラムを作成しています。読み取り方法はありますが、同じファイルをさらにロードすると問題が発生しました。UML ダイアグラムの作成に問題が生じるため、同じファイルのロードを拒否したいと思います。

アップロードされたファイルをArrayListに保存し、以前にロードされたファイルがあるArrayListに保存されたファイルで各ロードファイルをチェックするように解決しようとしています。

次の問題は、同じファイルを選択したときに [はい] または [いいえ] ボタンをクリックすると、ファイルが均等に読み込まれることです。

そして、この回答を作成すると、次の問題が見つかりました。ユーザーが複数のファイルを選択すると、ArrayList は一度に 2 つのファイルを追加する方法を知りません。

この問題をより簡単に解決する方法はありますか?

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);
            }
        }
    }
}

アドバイスをありがとう。私はすでにアイデアを失いました。私の英語でごめんなさい。

4

1 に答える 1

1

ここにある 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();ことを確認したので、必要なのは、既に読み込まれたファイル名を含む配列に追加することだけです。

于 2012-04-07T13:57:12.293 に答える