Permitir que não mude o diretório padrão JFileChooser

6 respostas
monike

Boa Tarde Galera!
Como posso fazer para "Travar" um diretorio padrao para que o usuario nao tenha o poder de escolher um outro usando JFileChooser?
Obrigada!!!

botaoExibirLog.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {	
				
				JFileChooser chooser = new JFileChooser(new File("C:/WORKSPACE_RAD/Importacao_Planilha/Logs"));
				chooser.showOpenDialog(new Panel());

				if (chooser.getSelectedFile() != null) {
					
					File file = new File(chooser.getSelectedFile().getPath());					
										
						BufferedReader br;
						StringBuffer bufSaida = new StringBuffer();

						try {
							br = new BufferedReader(new FileReader(file));
							String linha;
							while( (linha = br.readLine()) != null ){
							bufSaida.append(linha + "\n");
						}
							br.close();
							TelaLog telaLog = new TelaLog();
							telaLog.getJTextAreaExibicao().setText(bufSaida.toString());
														
						} catch (FileNotFoundException e1) {
							JOptionPane.showMessageDialog(null, "O arquivo especificado não foi encontrado", "Mensagem", JOptionPane.ERROR_MESSAGE);
							
						} catch (IOException ex) {
							JOptionPane.showMessageDialog(null, ex.getCause(), "Mensagem", JOptionPane.ERROR_MESSAGE);
						}
				}
			}
		});

6 Respostas

davidbuzatto

Não tem como.

Se você quer a funcionalidade de apenas selecioanr arquivos de um determinado diretório, use um JList, popule-o com os arquivos do diretório desejado e permita que o usuário selecione um dos itens da lista.

[]´s

davidbuzatto

Exemplo:

Arquivo "JFileList.java"
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.ListSelectionModel;

/**
 *
 * @author David Buzatto
 */
public class JFileList extends JList {

    /**
     * Construtor padrão.
     */
    public JFileList() {
        
        /* 
         * se quiser/precisar, implemente seu próprio modelo. no caso, 
         * estou usando um DefaultListModel mesmo.
         */
        super( new DefaultListModel() );
        
        // permite seleção única
        setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
        
    }

    /**
     * Popula o modelo da lista com FileItems, que por sua vez estão
     * relacionados aos arquivos do diretório passado por parâmetro.
     * 
     * @param directory Diretório que contém os arquivos que devem ser 
     * mostrados.
     */
    public void listDirectoryFiles( File directory ) {
        
        // obtém o modelo
        DefaultListModel model = ( DefaultListModel ) getModel();
        
        // remove todos os elementos
        model.removeAllElements();
        
        /* 
         * itera pelo arquivo passado, desde que não seja null e que seja
         * um diretório.
         */
        
        if ( directory != null && directory.isDirectory() ) {
            
            for ( File f : directory.listFiles() ) {
                
                // se o arquivo do momento não for um diretório...
                if ( !f.isDirectory() ) {
                    
                    // cria um FileItem e insere no modelo
                    FileItem item = new FileItem( f );
                    model.addElement( item );
                    
                }
                
            }
            
        }
        
    }

    /**
     * Obtém o arquivo selecionado.
     * 
     * @return O arquivo selecionado da lista, null caso nenhum arquivo esteja 
     * selecionado.
     */
    public File getSelectedFile() {
        if ( getSelectedValue() != null ) {
            return ( ( FileItem ) getSelectedValue() ).file;
        } else {
            return null;
        }
    }

    /**
     * Item de arquivo para ser exibido na lista.
     */
    private class FileItem {
        
        File file;
        
        FileItem( File file ) {
            this.file = file;
        }
        
        @Override
        public String toString() {
            return file.getName();
        }
        
    }

}
Arquivo "FrameTeste.java"
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author David Buzatto
 */
public class FrameTeste extends JFrame {

    private JFileList jFileList;
    private JButton btn;

    public FrameTeste() {

        setTitle( "Teste Lista de Arquivos" );
        setSize( 400, 400 );
        setDefaultCloseOperation( EXIT_ON_CLOSE );

        jFileList = new JFileList();
        jFileList.listDirectoryFiles( new File( "C:/" ) );

        btn = new JButton( "Obter arquivo selecionado!" );
        btn.addActionListener( new ActionListener() {

            public void actionPerformed( ActionEvent e ) {

                File arquivoSelecionado = jFileList.getSelectedFile();

                if ( arquivoSelecionado != null ) {

                    JOptionPane.showMessageDialog(
                            null,
                            "Arquivo selecionado: " + arquivoSelecionado.getName() + "\n"
                            + "Caminho completo: " + arquivoSelecionado.getAbsolutePath(),
                            "Arquivo Selecionado", JOptionPane.INFORMATION_MESSAGE );

                } else {

                    JOptionPane.showMessageDialog(
                            null,
                            "Selecione um arquivo!",
                            "ERRO", JOptionPane.ERROR_MESSAGE );

                }

            }

        });

        add( jFileList, BorderLayout.CENTER );
        add( btn, BorderLayout.SOUTH );

    }

    public static void main( String[] args ) {
        new FrameTeste().setVisible( true );
    }

}
[]´s
monike

Muito obrigada Pela Ajuda davidbuzatto :)!!!

davidbuzatto

Disponha :wink:

[]´s

monike
Olá, fiz algumas alterações nesta classe , mas nao estou conseguindo colocar um botao ao lado no outro no rodapé. :( Se puderem me ajudar....obrigada a todos !!!
package br.com.bradeseg.telas;
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;

import br.com.bradeseg.recursos.Campos;
import br.com.bradeseg.util.Util;


public class ExibirLog extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	SimpleDateFormat sdfHora = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

    private JFileList jFileList;
    private JButton btnAbrir = new JButton( "Abrir" );
    private JButton btnLimpar = new JButton( "Limpar" );
	String dataHoraAtual=  sdfHora.format(new Date());

    public ExibirLog()  {

        setTitle( "Exibição Log" );
        setSize(400,200 );
        btnAbrir.setBounds(new Rectangle(350, 124, 120, 31));
        btnLimpar.setBounds(new Rectangle(350, 124, 120, 31));
                               
        setResizable(false);
      
        jFileList = new JFileList();
        jFileList.listDirectoryFiles(new File("C:/TESTE/"));
        
        add( jFileList, BorderLayout.CENTER );      
        add( btnAbrir, BorderLayout.EAST);
        add( btnLimpar, BorderLayout.SOUTH);
        add(new  JScrollPane(jFileList)); 
        
        //WORKSPACE_RAD/Importacao_Planilha/Logs
                       
    	try {
			setIconImage(ImageIO.read(getClass().getResource(Campos.IMG_ICON)));
		} catch (IOException ioException) {
		    JOptionPane.showMessageDialog(null, ioException.getCause(),"Mensagem", JOptionPane.ERROR_MESSAGE);
		}
		
		
		
		btnLimpar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {	
				
				
				 File arquivoSelecionado = jFileList.getSelectedFile();
				 if ( arquivoSelecionado != null ) {
						int response = JOptionPane.showConfirmDialog(null,"Deseja excluir o arquivo de log?", "Confirmação",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
						if (response == JOptionPane.YES_OPTION) {
							 Util.removerArquivosPasta(arquivoSelecionado);
						     jFileList.listDirectoryFiles(new File("C:/TESTE/"));			
							JOptionPane.showMessageDialog(null, "Exclusão efetuada com sucesso!","Exclusão", JOptionPane.WARNING_MESSAGE);
						}    
				 }else{
					  JOptionPane.showMessageDialog(null, "Selecione um arquivo de log para exclusão","Mensagem", JOptionPane.WARNING_MESSAGE);
				 }
			}
		});
		
		
      
		btnAbrir.addActionListener( new ActionListener() {
            public void actionPerformed( ActionEvent e ) {

                File arquivoSelecionado = jFileList.getSelectedFile();

                if ( arquivoSelecionado != null ) {
                	
                	BufferedReader br;
					StringBuffer bufSaida = new StringBuffer();

					
						try {
							br = new BufferedReader(new FileReader(arquivoSelecionado.getAbsolutePath()));
							String linha;
							while( (linha = br.readLine()) != null ){
							bufSaida.append(linha + "\n");
						}
							br.close();
	
						} catch (FileNotFoundException e1) {
							JOptionPane.showMessageDialog(null, "O arquivo especificado não foi encontrado", "Mensagem", JOptionPane.ERROR_MESSAGE);
							
						} catch (IOException ex) {
							JOptionPane.showMessageDialog(null, ex.getCause(), "Mensagem", JOptionPane.ERROR_MESSAGE);
							
						}

                    JOptionPane.showMessageDialog(
                            null,
                            "Data: " + dataHoraAtual + "\n" 
                            +"Arquivo selecionado: " + arquivoSelecionado.getName() + "\n"
                            + "Caminho completo: " + arquivoSelecionado.getAbsolutePath()+ "\n"
                            + "Causa: " + bufSaida.toString(),
                            "Log Selecionado", JOptionPane.WARNING_MESSAGE);
                    
                }else {

                    JOptionPane.showMessageDialog(null, "Selecione um arquivo de log","Mensagem", JOptionPane.WARNING_MESSAGE);
                }
            }

        });
        
     
    }
    


	public static void main( String[] args ) {
        new ExibirLog().setVisible( true );
    }

}  //  @jve:decl-index=0:visual-constraint="36,37"
package br.com.bradeseg.telas;

import java.io.File;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JList;
import javax.swing.ListSelectionModel;

public class JFileList extends JList {

    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
     * Construtor padrão.
     */
    public JFileList() {
        
        /* 
         * se quiser/precisar, implemente seu próprio modelo. no caso, 
         * estou usando um DefaultListModel.
         */
        super( new DefaultListModel() );
        
        // permite seleção única
        setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
        
    }

    /**
     * Popula o modelo da lista com FileItems, que por sua vez estão
     * relacionados aos arquivos do diretório passado por parâmetro.
     * 
     * @param directory Diretório que contém os arquivos que devem ser 
     * mostrados.
     */
    public void listDirectoryFiles( File directory ) {
        
        // obtém o modelo
        DefaultListModel model = ( DefaultListModel ) getModel();
        
        // remove todos os elementos
        model.removeAllElements();
        
        /* 
         * itera pelo arquivo passado, desde que não seja null e que seja
         * um diretório.
         */
        
        if ( directory != null && directory.isDirectory() ) {
            
            for ( File f : directory.listFiles() ) {
                
                // se o arquivo do momento não for um diretório...
                if ( !f.isDirectory() ) {
                    
                    // cria um FileItem e insere no modelo
                    FileItem item = new FileItem( f );
                    model.addElement( item );
                    
                }
                
            }
            
        }
        
    }

    /**
     * Obtém o arquivo selecionado.
     * 
     * @return O arquivo selecionado da lista, null caso nenhum arquivo esteja 
     * selecionado.
     */
    public File getSelectedFile() {
        if ( getSelectedValue() != null ) {
            return ( ( FileItem ) getSelectedValue() ).file;
        } else {
            return null;
        }
    }

    /**
     * Item de arquivo para ser exibido na lista.
     */
    private class FileItem {
        
        File file;
        
        FileItem( File file ) {
            this.file = file;
        }
        
        @Override
        public String toString() {
            return file.getName();
        }
        
    }

}
davidbuzatto
Pq vc está inserindo o jFileList duas vezes??? Para resolver seu problema, basta criar um painel para conter os botões e então inseri-lo na área SOUTH. Altere seu código onde os componenets estão sendo inseridos no JFrame pelo código abaixo.
JPanel painelBotoes = new JPanel();
painelBotoes.add( btnAbrir );
painelBotoes.add( btnLimpar );

add( new JScrollPane( jFileList ), BorderLayout.CENTER );
add( painelBotoes, BorderLayout.SOUTH );
Note que um JPanel tem como gerenciador de layout padrão o FlowLayout, enquanto em um JFrame o gerenciador padrão é o BorderLayout.

[]´s

Criado 3 de novembro de 2010
Ultima resposta 5 de nov. de 2010
Respostas 6
Participantes 2