2014-11-12 9 views
1

하나는 모든 파일을 표시하고 다른 하나는 특정 확장자를 표시하는 두 가지 옵션이있는 파일 필터가 필요합니다.새 JFileChooser FileFilter를 설정하고 이전 파일을 재설정하십시오.

특정 확장 프로그램은 기본적으로 선택되어 있어야합니다.

저는 같은 JFileChooser를 두 번 사용합니다. 처음에는 .fas 파일을 표시하고 두 번째는 .xls 파일을 표시합니다.

지금이 코드를 사용하고 있지만 몇 가지 이유로 이전 파일 확장명을 덮어 쓰지 않습니다. 여기에 대한 많은 답은 JFileChooser를 재활용하면 비슷한 코드와 정확히 같은 문제를 갖습니다.

첫 번째 부분은 모든

fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() { 
    @Override 
    public boolean accept(File file) { 
     return file.isDirectory() || file.getAbsolutePath().endsWith(".fas"); 
    } 

    @Override 
    public String getDescription() { 
     return "Fasta"; 
    } 
}); 
// more modern API, same result 
// fileChooser.setFileFilter(new FileNameExtensionFilter("File fasta", "fas")); 

제 2 부분을 작동합니다. 이것은 같은 JFileChooser의 두 번째 "여는 (opening)"에서 사용됩니다. 그냥 필터를 추가하는 것 같습니다 (.fas 파일을 선택하는 옵션이 남아 있습니다).

// delete name of previously selected file 
File currentDirectory = fileChooser.getCurrentDirectory(); 
fileChooser.setSelectedFile(new File("")); 
fileChooser.setCurrentDirectory(currentDirectory); 

// set new file filter 
fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() { 
    @Override 
    public boolean accept(File file) { 
     return file.isDirectory() || file.getAbsolutePath().endsWith(".xls"); 
    } 

    @Override 
    public String getDescription() { 
     return "Excel 97"; 
    } 
}); 
// more modern API, same result 
// fileChooser.setFileFilter(new FileNameExtensionFilter("Excel 97", "xls")); 

답변

2

setFileFilter은 실제로는 파일 필터 (다른 필터를 대체하지 않음)로 설정되어 있기 때문에 오도 될 수 있습니다.

JFileChooser을 재활용하려는 경우 가장 간단한 해결책은 새 필터를 설정하기 전에 resetChoosableFileFilters() (으)로 전화하는 것입니다. 두 번째 선택

// delete name of previously selected file, but stay in the same directory 
File currentDirectory = fileChooser.getCurrentDirectory(); 
fileChooser.setSelectedFile(new File("")); 
fileChooser.setCurrentDirectory(currentDirectory); 

// reset current file filters 
fileChooser.resetChoosableFileFilters(); 

// set new file filter 
fileChooser.setFileFilter(new FileNameExtensionFilter("Excel 97", "xls")); 

// the "All files" filter will be present too, unless you uncomment this 
// fileChooser.setAcceptAllFileFilterUsed(false); 
+0

첫 번째 선택과 두 번째 선택을 구별 할 필요가 없습니다. – Thomas

+0

@ 토마스 감사합니다, 지금 고쳐졌습니다 – Agostino

+0

@ 토마스 답변보다 더 읽기 쉽습니다 (그의 답변은 맞지만). – PhoneixS

2

콤보 모델을 운전하는 사람으로 보이는 xxxChoosableFileFilter() 방법을 사용해보십시오.

setFileFilter()은 선택 가능한 필터가없는 경우 콤보 상자에 사용되는 기본 필터를 설정하는 것처럼 보입니다. 그러나 선택 가능한 필터가있는 경우 기본 필터는 무시됩니다. 그래서 나는 코드 어딘가에 (당신이나 스윙) 기본 필터가 선택 도구에 추가되었다고 가정합니다. 여기

내가 위에서 언급 한 것을 할 것 같다 콤보 모델 중 하나에 대한 JDK 8의 소스의 코드 조각입니다 :이다

public Object getSelectedItem() { 
    // Ensure that the current filter is in the list. 
    // NOTE: we shouldnt' have to do this, since JFileChooser adds 
    // the filter to the choosable filters list when the filter 
    // is set. Lets be paranoid just in case someone overrides 
    // setFileFilter in JFileChooser. 
    FileFilter currentFilter = getFileChooser().getFileFilter(); 
    boolean found = false; 
    if(currentFilter != null) { 
    for (FileFilter filter : filters) { 
     if (filter == currentFilter) { 
     found = true; 
     } 
    } 
    if(found == false) { 
     getFileChooser().addChoosableFileFilter(currentFilter); 
    } 
    } 
    return getFileChooser().getFileFilter(); 
} 

문제를 볼 수있는이 현재의 필터는의 일부가 아닌 경우 모델 filters 배열의 경우 선택 가능한 필터에 추가되므로 계속 표시됩니다.

+0

당신은 바로 하나가 아닌 어쩌면 setChoosableFileFilter 의미에 대한 첫 번째 선택

fileChooser.setFileFilter(new FileNameExtensionFilter("File fasta", "fas")); 

코드에 대한

코드? – Agostino

+1

@Agostino 아니,'setFileFilter' 대신'addChoosableFileFilter'와'resetChoosableFileFilters'를 사용하는 것을 의미합니다. – Thomas

+0

resetChoosableFileFilters는 내가 필요한 것입니다! 나는 실제로 그것이 무엇을하는지 _selected_ 파일 필터가 (다른 필터를 대체하지 않고) 설정 되었기 때문에 setFileFilter라는 이름을 잘못 선택했다고 생각한다. – Agostino