Quero selecionar um diretório (…\pasta) e não um caminho de um arquivo (…\pasta\arquivo) em um JFileChooser… é possivel?
Apos escolher o diretório, queria que o mesmo mostrasse em um JTable os arquivos contidos neste diretório… mostrando os dados de cada arquivo, mostrar somente JPG, JPEG, BMP, GIF: nome, tamanho, extenção e dimenção…
Use o setFileSelectionMode da classe JFileChooser para fazer com que sejam listados apenas os diretórios.
Depois use o método list() da classe File para pegar todos os arquivos do diretório.
[code]public class ArquivosModel extends AbstractTableModel{
private ArrayList listaArquivos = new ArrayList();
public int getRowCount() {
return listaArquivos.size();
}
public int getColumnCount() {
return 4;
}
public Object getValueAt(int rowIndex, int columnIndex) {
//
Arquivo arquivos = (Arquivo) listaArquivos.get(rowIndex);
switch(columnIndex){
case 0: return arquivos.getNome();
case 1: return arquivos.getTamanho();
case 2: return arquivos.getDimensao();
case 3: return arquivos.getExtensao();
default: return null;
}
}
}[/code]
Agora como capturo em um ArrayList cada arquivo em um determinado caminho? e como coloca-lo na JTable?
Como você pode ver na documentação, o list() retorna um array de strings com o caminho dos arquivos no determinado diretório. Assim, você pode exibir este caminho, ou se quizer mais informações criar files com estes caminhos, mas ou menos como eu fiz abaixo:
import java.io.File;
public class Test {
/**
* Simples demonstração do uso do método list()
* */
public static void main(String[] args) {
File arquivo = new File("c:\\");
String[] caminhos = null;
if (arquivo.isDirectory()) {
caminhos = arquivo.list();
} else {
return;
}
if (caminhos == null || caminhos.length == 0) {
// se não houver arquivo encerra
return;
}
File[] arquivos = new File[caminhos.length];
for (int i = 0; i < arquivos.length; i++) {
arquivos[i] = new File(caminhos[i]);
}
for (File file : arquivos) {
System.out.println(file);
}
}
}
Assim, o que você precisa fazer é que seu model tenha um array de File ou de String e que este array seja atualizado sempre que um novo diretório for selecionado.
Depende do seu objetivo. Se você quizer apenas exibir o caminho ou nome do arquivo, um array de String atenderia, acredito eu.
Agora se você quizer utilizar os métodos da classe File para exibir informações mais detalhadas, um array de File seria mais adequado.
ArrayList<Arquivo> arrayFile = new ArrayList<Arquivo>();
File arquivo = new File(caminho);
//filtro, capturando somente arquivos com extensao .jpg
FilenameFilter filtro = new FilenameFilter(){
public boolean accept(File arquivo, String name) {
return name.endsWith("jpg");
}
};
//resultado recebe lista de arquivos .jpg contidos em um diretório.
File[] resultado = arquivo.listFiles(filtro);
if(resultado==null){
JOptionPane.showMessageDialog(null, "Nenhum arquivo JPG disponível neste diretório");
}else{
for(int i=0;i<resultado.length;i++){
Arquivo registro = new Arquivo();
registro.setNome(resultado[i]);
registro.setTamanho(resultado[i]);
registro.setDimensao(resultado[i]);
registro.setExtensao("jpg");
arrayFile.add(registro);
}
}
return arrayFile;
}[/code]
função do botão… (Selecionar diretório)
[code]JFileChooser Caminho = new JFileChooser();
Caminho.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
//se clicar em Abrir...
if (Caminho.showOpenDialog(this)==JFileChooser.APPROVE_OPTION) {
jLabel5.setText(Caminho.getSelectedFile().getPath());
ArrayList lista = consultaArquivo(Caminho.getSelectedFile().getPath());
String[] colunas = new String[]{"Nome","Tamanho","Dimensão","Extensão"};
ArquivosModel model = new ArquivosModel(lista, colunas);
jTable1.setModel(model);
}[/code]