9

PDF を Apache PDFBox とマージするための単純な Swing アプリケーションの場合、 を使用しJFileChooserて 1 つまたは複数の PDF ファイルを選択し、それ/それらをJList. これまでのところ問題はありません。

私を悩ませているのは、ボタンをクリックして別のファイルを再度追加すると、以前の選択が JFileChooser に残っていることです。これは望ましくありません。選択は最初は空でなければなりません。

私はこれを試しましたが、動作も例外もスローしません:

    pdfFileChooser.setSelectedFile(null);

関連するコードは次のとおりです。

    pdfFileChooser.setAcceptAllFileFilterUsed(false);
    pdfFileChooser.setMultiSelectionEnabled(true);
    pdfFileChooser.setFileFilter(new FileFilter() {

       @Override
       public boolean accept(File arg0) {
          return arg0.getName().endsWith(".pdf");
       }
       @Override
       public String getDescription() {
          return "*.pdf";
       }
    } );

    JButton btnAddFile = new JButton("Add file");
    btnAddFile.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent arg0) {
          if(pdfFileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
             addFileToList(pdfFileChooser.getSelectedFiles());
             pdfFileChooser.setSelectedFile(null);
          }
       }
    });

    private void addFileToList(File[] filesToAdd) {
       if((filesToAdd != null) && (filesToAdd.length > 0)) {
          DefaultListModel model = (DefaultListModel)listFiles.getModel();
          for(File file : filesToAdd) {
             if(!model.contains(file)) {
                model.addElement(file);                 
             }
          }
       }
    }

ファイルが最初に選択されないように、JFileChooser から選択を削除するにはどうすればよいですか?

4

3 に答える 3

14

これは、私見、バグです。

(親切に指摘されているように、APIはselectedFileメソッドにnullを渡した場合に何が起こるかを示していないため、「バグ」は強い言葉になる可能性があります。代わりに、欠落している機能であると示唆する方が合理的です)

このようなことを試してください...

JFileChooser fc = new JFileChooser();
fc.showOpenDialog(null);
File selected = fc.getSelectedFile();
System.out.println("You selected " + selected);

File currentDirectory = fc.getCurrentDirectory();
// Hack alert
fc.setSelectedFile(new File(""));
fc.setCurrentDirectory(currentDirectory);

fc.showOpenDialog(null);
selected = fc.getSelectedFile();

System.out.println("You selected " + selected);

基本的に、選択したファイルの変更はUIに依存しているようで、SELECTED_FILE_CHANGED_PROPERTYプロパティ変更イベントに依存しています。null発生しているように見えるのは、選択したファイルのテキストフィールドを(特に)変更するときに参照を無視しているということです。

MetalとWindowsのルックアンドフィールを使用してこれをテストしました

于 2012-10-04T22:45:41.250 に答える
1

これは機能します:

 fileChooser.setSelectedFile(new File(""));
 fileChooser.setSelectedFiles(new File[]{new File("")});

ただし、より高速な代替ファイルが必要な場合は、10Kを超えるファイルを選択した場合(前のコードにはかなりの時間がかかります)。

 fileChooser.setSelectedFile(new File(""));
 ((FilePane) fileChooser.getComponents()[2]).clearSelection();
于 2012-11-10T18:11:06.770 に答える
0

新しい JFileChooser インスタンスを作成し、最後に使用したディレクトリをそれに渡します。最後に使用したディレクトリのデフォルトはホーム ディレクトリです。有効なファイルを選択すると、そのファイルのディレクトリが保存され、次に新しい JFileChooser を開くときにそのディレクトリが使用されます。

于 2015-01-21T20:40:17.680 に答える