Utility Swing per elenco file e filtro estensione

This page was exported from - JPinup
Export date: Thu Sep 29 16:45:48 2016 / +0000 GMT
Utility Swing per elenco file e filtro estensione
Quest'articolo ha come scopo quello di realizzare una piccola applicazione che elenchi tutti i file presenti nel file system e filtrarli
per estensione, con la possibilità di ottenere un anteprima del file se si tratta di un'immagine. Esempio:
Il tutto è stato sviluppando utilizzando il framework Swing, messo a disposizione da Java. Per le ricerca dei file si è fatto uso del
pattern Fork Join (disponibile anch'esso già nelle librerie Java).
L'esempio è stato basato sul concetto di Task e non su quello di Thread (per approfondimento seguire il link):
Thread: rappresenta una risorsa del sistema operativo
Task: non crea un thread, ma è eseguito da uno scheduler.
Descriverò brevemente alcune parti di codice, lasciando allo sviluppatore la possibilità di scaricare l'intero progetto da GitHub.
Per implementare la combobox dinamica, si è fatto uso di DefaultComboBoxModel.
Per implementare la lista dinamica, si è fatto uso di DefaultListModel.
Vediamo come primo passo l'interfaccia utente:
/*
* author: Ezio Tomassetti
*/
package it.jpinup.gui;
import it.jpinup.gui.chooser.OpenFileChooser;
import it.jpinup.gui.listener.ComboBoxListener;
import it.jpinup.gui.listener.CustomExecutionListener;
import it.jpinup.gui.listener.ListBoxListener;
import it.jpinup.map.ListHashMap;
import it.jpinup.map.ViewFile;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com
| Page 1/5 |
This page was exported from - JPinup
Export date: Thu Sep 29 16:45:48 2016 / +0000 GMT
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
public class FileView extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public FileView() {
initUI();
}
private void initUI() {
setLayout(new FlowLayout());
setTitle("File Ext counter");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = new JPanel();
ImagePanel imagePanel = new ImagePanel();
imagePanel.setPreferredSize(new Dimension(400, 400));
((JPanel) contentPane).setBorder(BorderFactory
.createTitledBorder("File Ext counter"));
BoxLayout layout = new BoxLayout(contentPane, BoxLayout.Y_AXIS);
contentPane.setLayout(layout);
JTextField filePath = new JTextField(90);
filePath.setName("filePath");
filePath.setEditable(true);
ActionListener chooser = new OpenFileChooser(filePath, FileView.this);
addFileChooser(filePath, contentPane, "Percorso root", "path", chooser);
JTextField counter = new JTextField(90);
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com
| Page 2/5 |
This page was exported from - JPinup
Export date: Thu Sep 29 16:45:48 2016 / +0000 GMT
counter.setText("Totale estensioni:");
counter.setName("counter");
counter.setEditable(false);
JButton genera = new JButton("Analizza");
DefaultListModel<ViewFile> listModel = new DefaultListModel<ViewFile>();
DefaultComboBoxModel<String> defaultComboBoxModel = new DefaultComboBoxModel<String>();
JComboBox<String> comboBox = new JComboBox<String>(defaultComboBoxModel);
JPanel comboPane = new JPanel();
comboPane.add(comboBox);
JList<ViewFile> list = new JList<ViewFile>(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setVisibleRowCount(-1);
list.addMouseListener(new ListBoxListener(this,imagePanel));
JScrollPane listPanel = new JScrollPane(list);
listPanel.setPreferredSize(new Dimension(40, 220));
ListHashMap listaFiles = new ListHashMap();
listaFiles.setDefaultComboBoxModel(defaultComboBoxModel);
listaFiles.setListModel(listModel);
defaultComboBoxModel.addListDataListener(new ComboBoxListener(listaFiles));
CustomExecutionListener generateListener = new CustomExecutionListener(
filePath, counter,listaFiles);
genera.addActionListener(generateListener);
JPanel panelButton = new JPanel();
panelButton.add(genera);
contentPane.add(counter);
contentPane.add(panelButton);
contentPane.add(comboPane);
contentPane.add(listPanel);
contentPane.add(imagePanel);
add(contentPane);
pack();
}
private void addFileChooser(JTextField text, Container contentPane,
String label, String name, ActionListener chooser) {
JButton openFileChooser = new JButton("Apri File");
openFileChooser.addActionListener(chooser);
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com
| Page 3/5 |
This page was exported from - JPinup
Export date: Thu Sep 29 16:45:48 2016 / +0000 GMT
JPanel panelButton = new JPanel();
panelButton.setAlignmentX(LEFT_ALIGNMENT);
panelButton.setAlignmentY(LEFT_ALIGNMENT);
panelButton.add(openFileChooser);
panelButton.add(new JLabel(label));
contentPane.add(text);
contentPane.add(panelButton);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
FileView ex = new FileView();
ex.setVisible(true);
}
});
}
}
Per la scansione dei file, il pattern utilizzato è quello del fork Join, nello specifico si è fatto uso di RecursiveAction, ovvero task che
non tornano un risultato. Premettendo che il progetto non ha lo scopo di progettare un'architettura ma di dare idea degli strumenti
presenti in Java, descriviamo con un diagramma ciò che ci aspettiamo dai task ricorsivi:
Si parte dallo stato iniziale, per ogni directory si crea un task (e si invoca "fork", in modo da creare una gerarchia di task),
mentre per i file basta inserirli in una lista generale, acceduta in maniera concorrente (e quindi gestita pensando a ciò). Ogni
task attende che i figli completino la scansione.
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com
| Page 4/5 |
This page was exported from - JPinup
Export date: Thu Sep 29 16:45:48 2016 / +0000 GMT
Il blocco di codice che implementa ciò che si è descritto:
if (fileCurrent.isDirectory()) {
FileRecursiveAction myRecursiveTask = new FileRecursiveAction(
listaFiles, fileCurrent);
listaTasks.add(myRecursiveTask);
myRecursiveTask.fork();
} else {
addFile(fileCurrent);
}
Per attendere che i task attendino il completamento dei figli:
for (RecursiveAction task : listaTasks) {
task.join();
}
GitHub
Output as PDF file has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com
| Page 5/5 |