Pergunta

Eu tenho um JDialog com um botão / campo de texto para o usuário para selecionar um arquivo. Aqui está o código:

FileDialog chooser = new FileDialog(this, "Save As", FileDialog.SAVE );
String startDir = saveAsField.getText().substring( 0, saveAsField.getText().lastIndexOf('\\') );
chooser.setDirectory(startDir);
chooser.setVisible(true);
String fileName = chooser.getFile();

Meu problema é que em vez de ver um filtro de todos os arquivos, eu quero dar um filtro personalizado, por exemplo, para documentos do Word ou algo assim. Eu configurei um costume FilenameFilter usando setFilenameFilter (), mas não parecem funcionar. Eu notei que ele diz nos documentos que o filtro personalizado não funciona no Windows (isto corre em Windows XP / Vista / 7). Aqui foi a minha implementação do filtro:

chooser.setFilenameFilter( new geFilter() );
public class geFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return name.endsWith( ".doc" ) || name.endsWith( ".docx" );
    }
}

Estou fazendo algo errado aqui? Além disso, eu quero uma descrição para aparecer na caixa, como "Microsoft Word (* .doc * .docx)" mas não tenho certeza de como fazer isso.

Toda e qualquer ajuda é apreciada.

Foi útil?

Solução

AWT não é realmente a maneira preferida de escrever Java GUI aplicações nestes dias. Sun parece ter a maioria abandonou. As duas opções mais populares são Swing e SWT . Então eu acho que eles realmente não desenvolver as APIs muito extensivamente para adicionar características modernas. (Err, para responder à sua pergunta: Não, você não parece ser capaz de fazer isso com AWT)

Swing tem a vantagem de que ele é realmente write-once-run-em qualquer lugar e pode ser exactamente o mesmo em todos os lugares. Há Look & sente que tentam fazer nativa balanço olhar, alguns são melhores do que outros (Mac não é terrível, o Windows é bom, GTK não é). Ainda assim, se você quiser um aplicativo que realmente parece e funciona exatamente o mesmo em todos os lugares, Baloiço vai deixar você fazer isso. Além disso, ele funciona out-of-the-box sem quaisquer bibliotecas extras. O desempenho não é grande.

Balanço é JFileChooser vai deixar tu fazes o que queres. Criar uma subclasse de FileFilter e chamada setFileFilter na JFileChooser.

SWT leva o write-once-run-em qualquer lugar para o extremo oposto. Você ainda tem uma base de código que você escreve contra, mas ele realmente usa os widgets nativos em cada plataforma, por isso geralmente parece um aplicativo nativo (não perfeito em todos os lugares, mas ainda impressionante). É rápido e bastante confiável na minha experiência. Eclipse (e outros softwares de alto perfil) usa SWT por isso é em uso muito pesado. Mas exige JARs e DLLs específicas de plataforma.

Outras dicas

desde que você está usando JDialog, que é uma classe de balanço porque não usando JFileChooser ?

 JFileChooser fc = new JFileChooser("C:\\");
 fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));

FileNameExtensionFilter é um bom Java 6 classe que faz exatamente o que você quer.

Eu também estou tentando fazer isso. Eu quero usar FileDialog em vez de JFileChooser.

Eu encontrei a resposta aqui: http://www.rgagnon.com/javadetails/ java-0247.html

Ele diz que "na plataforma Win, o método setFilenameFilter não funcionam. Devemos usar o método setFile em vez de definir um filtro."

Há código fonte no link especificado.

Eu testei e funciona:

FileDialog fd = new FileDialog((Frame) null, "Save File", FileDialog.SAVE);
fd.setFile("*.txt");
fd.setVisible(true);

String file = fd.getFile();
System.out.println(file);
System.exit(0);

Você pode chamar do Windows filedialog nativa (CFileDialog) com JNI. Os filtros podem ser ajustados para CFileDialog facilmente.

Eu escrevi uma classe de invólucro simples para CFileDialog há vários meses, Se você está interessado, você pode obter o código fonte e binário de

projeto Xfiledialog no Google Code

Se você nunca usar JavaFX 2 , a FileChooser classe vai fazer exatamente o que você precisa sem nenhum dos problemas JFileChooser / FileDialog. Você também pode incorporar JavaFX 2 componentes dentro aplicações Swing, mas você precisa JavaFX tempo de execução .

Exemplo:

    FileChooser fc = new FileChooser();
    FileChooser.ExtensionFilter filter;
    filter = new FileChooser.ExtensionFilter("Text files (*.txt)", "*.txt");
    fc.getExtensionFilters().add(filter);
    File f = fc.showOpenDialog(primaryStage);
    System.out.println(f);

método Basta usar setFilenameFilter da instância FileDialog fd:

            fd.setFilenameFilter(new FilenameFilter()
                            {
                                @Override
                                public boolean accept(File file, String s)
                                {
                                    // enter code to return TRUE or FALSE here
                                    return s.contains(".txt");
                                }
                            });
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top