JFileChoose e FileFilter

Eu criei um FileFilter…

Como faz para qd o cara mandar salvar.

O usuario escreve: nomedomeuarquivo

:arrow: entao caso o filtro esteja para pdf
ele acresenta nomedomeuarquivo.pdf

:arrow: Se estiver em gif
ele acresenta nomedomeuarquivo.gif

para que a pessoa nao precise digitar a extensão.

vlws

Vc criou o seu próprio FileFilter, né???

Não é tão trivial, tem um pulo do gato com a classe java.io.File: essa classe é um Wrapper pra um String.

No seu método accept vc pode aceitar nomes com a extensão selecionada ou sem extensão nenhuma. Na hora de salvar, vc faz assim:

  1. testa se o arquivo existe (file.exists()); Se sim, via pra 4
  2. pega o nome, e testa se ele tem a extensão selecionada (vc pode guardar isso no sua extensão de FileFilter e acessar com JFileChooser.getFileFilter()), e se não tiver, acrescenta ao nome. Vai pra 3
  3. cria o arquivo a parfir do File
  4. salva ou lê, não sei pra q vc usa o chooser.

qq coisa grita!
[]s[/code]

dukejeffrie, to com duvida nesse passo ae…
não entendi muito bem. Como eu sei qual extenção do filefilter ele escolheu…??

:arrow: resumo do meu filefilter

[code]public class FileFilterSunSoft extends FileFilter {

private Hashtable filters;
private String fullDescription;
private String description;



public FileFilterSunSoft( String extensions, String description ){
	this();
	if( extensions != null )
	    addExtension( extensions );
	if( description != null )
	    setDescription( description );    	
}



public boolean accept( File f ){
if( f != null ){
if( f.isDirectory() ) {
return true;
}
String extension = getExtension( f );
if( extension != null && filters.get( getExtension( f ) ) != null ) {
return true;
}

	}
	return false;
}




public void addExtension( String extension ){
if( filters == null ){
filters = new Hashtable( 5 );
}

	filters.put( extension.toLowerCase(), this );
	fullDescription = null;
}

}

[/code]

humm… agora que estou entendendo essa parada…
tipo…
se eu quero um filtro para gif, outro pra jpg
eu tenho de criar objetos diferentes do meu filtro ne???

tipo

class JpgFiltro extends FileFilter { ... }

class GifFiltro extends FileFilter { ... }

ae no JFileChooser

fileChooser.addChoosableFileFilter( new GifFiltro() );
fileChooser.addChoosableFileFilter( new JpgFiltro() );
...
...

File fileName = fileChooser.getSelectedFile();
...
...
FileFilter filtro = fileChooser.getFileFilter();
...

Ae eu posso usar ou instanceof ou algum metado que retorne o nome da classe para saber qual filto e pessoa selecionou…

tomará q seja isso…
vou testar aki…
se não for me da um toke ae dukejeffrie

Exatamente!!

Bom, talvez ainda dê pra fazer com seu multi-extensão…

Mas o jeito legal é assim, com vários… daí vc adiciona com addChoosableFileFilter()…

Mais do que isso, vc pode ter um filtro que aceita mais de uma extensão, mas tem apenas uma default. Por exemplo, um filtro HTML aceitaria “*.htm, *.html”, mas teria só .html como default.

Sua mensagem veio durante meu reply, tomei o maior susto!! Hehehehe…

Ou vc usa instanceof, ou vc tem uma interface (ou classe abstrata pai) que implementa getExtension(), e como vc quem criou o JFileChooser, vc sabe que ali só tem dessas, fica com um cast só.

[]s
p.s.: pode me chamar de duke… 8)

como eh para salvar, então nao precisa de multi - extensão

como o cara vai salvar em .jpg e . gif

agora entendi melhor esse FileFilter e mudei um pouco o meu:

public class Filtro extends FileFilter { 
   private String filter; 
   private String description; 
       
   public Filtro( String filter, String description ){ 
      setFilter( filter ); 
      setDescription( description );       
   } 
    
   public void setFilter( String filter ){ 
      if( filter != null ) 
         this.filter = filter.toLowerCase(); 
   } 
    
   public String getFilter(){ 
      return filter; 
   } 
    
   public String getDescription(){ 
      return description; 
   } 
    
   public void setDescription( String description ){ 
      this.description = description; 
   } 
    
   public boolean accept( File f ){ 
      if( f != null ){ 
         if( f.isDirectory() ){ 
            return true; 
         } 
          
         String extension = getExtension( f ); 
         if( extension != null && extension.equals( filter ) ){ 
            return true; 
         } 
      } 
      return false; 
   } 
    
   public String getExtension( File f ){ 
      if( f != null ){ 
         String fileName = f.getName(); 
         int i = fileName.lastIndexOf( '.' ); 
         if( i > 0 && i < fileName.length() - 1 ){ 
            return fileName.substring( i + 1 ).toLowerCase(); 
             
         } 
      }       
      return null; 
   } 
} 

agora no meu arquivo ta assim:



Filtro gifFilter = new Filtro( "gif", "bla" ); 
Filtro jpgFilter = new Filtro( "jpg", "bla" ); 

... 
... 
fileChooser.addChoosableFileFilter( gifFilter ); 
fileChooser.addChoosableFileFilter( jpgFilter ); 
... 
File fileName = fileChooser.getSelectedFile(); 
...            
Filtro filter = (Filtro)fileChooser.getFileFilter(); 
... 
... 
... 
if( filter.getFilter().equals( gifFilter.getFilter() ) ){ 
//o construtor do ImageGif recebe um File 
   ImageGif gif = new ImageGif( validaFileName( fileName, filter ) ); 
} 
else if( filter.getFilter().equals( jpgFilter.getFilter() ) ){ 
   imageJpg jpg = new ImageJpg( validaFileName( fileName, filter ) ); 
} 

Minha função validaFileName:

        
        private File validaFileName( File f, Filtro filter ){ 
            
           if( filter.getExtension( f ) == null || !filter.getExtension( f ).equals( filter.getFilter() ) ){ 

              return new File( f.getName() + "." + filter.getFilter() ); 
           } 
           return f;            
        } 

Só que quando digito o nome do arquivo image.gif
funciona

mas quando digito image( pela logica era para ele acrescentar .gif)
nao funciona…
e nao sei se deixa alguma exeção sem printtrace, mas nao esta dando erro.
apenas nao acontece nada

EDITADO:

aff… a parada tava funcionando…
como tava dando apenas .getName não tava pegando o path inteira do arquivo… tava salvando em outro lugar e eu nem fragando

so mudei isso aki

[code]
private File validaFileName( File f, Filtro filter ){

if( filter.getExtension( f ) == null || !filter.getExtension( f ).equals( filter.getFilter() ) ) {
return new File( f.getAbsolutePath() + "." + filter.getFilter() );
}
return f;
}[/code]

vlws a duke… =)

Legal isso, mas como eu faria para aparecer apenas os arquivos com a extensão desejada (já mostrado anteriormente) e juntamento com as pasta ?