Avviare NetBeans
Nel menu File scegliere la voce: New Project. Si apre il riquadro di dialogo che consente di specificare il tipo di progetto: selezionare le voci: Java category e Java Application. Premere il pulsante Next per completare il secondo riquadro.
Nella casella Project Name scrivere: menuApri e, eventualmente, specificare la cartella in cui salvare i file del progetto
Togliere la marca di spunta alla casella Create Main Class.
clic sul pulsante Finish
nella casella del progetto, fare clic destro sul nodo Source Packages e, dal menu contestuale, scegliere New → Other. Si apre un riquadro di dialogo formato da due caselle. Nella casella category selezionare Swing GUI Forms e nella casella File Types selezionare JFrameForm. Clic sul pulsante Next.
Nella casella Class Name del secondo riquadro di dialogo scrivere menuApri.
Nella casella Package scrivere my.menuapri.risorse.
Clic sul pulsante Finish
Nella finestra delle proprietà assegnare un titolo al frame. Questo sarà il nome che comparirà nella barra del titolo della finestra dell'applicazione.
Nella casella Palette, aprire la categoria Swing Menus, trascinare il componente Menu Bar nell'angolo superiore sinistro del frame. Si otterrà una barra dei menu con due elementi già presenti.
Clic destro sull'elemento Edit del componente Menu Bar e, dal menu contestuale, scegliere la voce Delete.
Per aggiungere una voce al menu File che richiami il riquadro di dialogo "Apri File" quando l'applicazione sarà in esecuzione, nella categoria Swing Menus della casella Palette, trascinare il componente Menu Item (JMenuItem1) sulla barra dei menu e calarlo nell'elemento File della barra dei menu. Nota: la barra dei menu deve essere selezionata prima di aggiungere una voce di menu.
Clic destro sul componente jMenuItem1 e, dal menu contestuale, scegliere la voce Change Variable Name. Assegnare il nome Apri al componente e premere OK.
mentre il componente jMenuItem1 è ancora selezionato, premere la barra spaziatrice e modificare il testo del componente scrivendo Apri. Premere Invio per confermare la modifica.
Associare un gestore di evento alla voce di menu Apri. Clic destro sula voce del menu e scegliere Events → Action → action Performed dal menu contestuale. Si apre automaticamente la scheda Source, con il cursore posizionato all'interno del gestore di evento a cui è stato assegnato il nome: ApriActionPerformed(). Per il momento non completarlo.
Tornare alla scheda Design. Per aggiungere la voce di menu Esci, nella sezione category della casella Palette trascinare un componente Menu Item (JMenuItem1) nella barra dei menu, sotto alla voce Apri. Notare che, per indicare la posizione in cui verrà collocato l'elemento, compare una linea arancione.
clic destro sul jMenuItem1 e scegliere la voce Change Variable Name dal menu contestuale. Scrivere il nuovo nome dell'elemento: Esci e premere il pulsante OK.
Assicurarsi che l'elemento jMenuItem1 sia ancora selezionato e premere la barra spaziatrice per modificare il testo. Cambiare il testo in Esci e premere invio per confermare la modifica.
Specificare il gestore dell'evento associato alla voce del menu "Esci": clic destro sull'elemento di menu e e scegliere Events → Action → action Performed dal menu contestuale. Si apre automaticamente la scheda Source con il cursore posizionato sul metodo EsciActionPerformed(). Nella casella Navigator il metodo EsciActionPerformed appare sotto al nodo ApriActionPerformed()
Completare il metodo EsciActionPerformed() con la seguete linea:
System.exit(0);
Tornare alla scheda Design. Nella casella Palette trascinare un componente Text Area (JTextArea) sul form e ridimensionarlo, conterrà il documento di tipo testo del file che si apre.
Nella casella delle proprietà assegnare il nome textarea a questo componente.
Nella casella Navigator fare clic destro sul nodo Other components. Dal menu contestuale scegliere Add From Palette → Swing Windows → File Chooser
In alternativa al menu contestuale si può trascinare il componente JFileChooser dalla categora Swing Window della casella Palette nella parte vuota del frame, ma questa operazione è piuttosto difficile, perchè l'anteprima è molto grande e la si potrebbe inserire involontariamente in un pannello.
Verificare nella casella Navigator che il componente è stato inserito.
Clic destro sul nodo JFileChooser e cambiare il nome alla variabile in fileChooser.
Definire il gestore di evento Apri.
Selezionare il JFileChooser nella casella Navigator e modificare le sue proprietà nella casella delle Proprietà. Modificare la proprietà dialogTitle in Apri documento e premere invio.
Passare alal scheda Source. Incollare le seguenti linee nel metodo ApriActionPerformed().
private void ApriActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int esito = jFileChooser1.showOpenDialog(this);
if (esito == JFileChooser.APPROVE_OPTION) {
File file = jFileChooser1.getSelectedFile();
try {
// Si apre un documento di testo e lo si mostra nella text area
textarea.read( new FileReader( file.getAbsolutePath() ), null );
File selectedFile = jFileChooser1.getSelectedFile();
} catch (IOException ex) {
System.out.println("Errore nell'apertura del file "+file.getAbsolutePath());
}
} else {
System.out.println("Apertura annullata.");
}
}
L'apertura di un documento con l'applicazione creata presuppone che l'utente sappia esattamente quali sono i tipi di file ammessi. Ad esempio quando apre un file di testo, tra le estensioni ammesse ci sono: txt, xml, htm, mentre quando apre file di tipo immagine, le estensioni ammesse possono essere: jp, gi, png. Per evitare apertura di documenti non visualizzabili nei componenti usati, l'utente deve poter vedere solo i tipi di file ammessi dalla sua applicazione, come descritto nella prossima sezione.
Passare alla scheda Design e, nella finestra navigator, selezionare fileChooser.
Nella finestra delle proprietà fare clic sul pulsante con i puntini (…) sulla riga della proprietà fileFilter.
Si apre un riquadro di dialogo, sul quale è presente una casella a discesa. Aprire questa casella e scegliere Custom Code
Viene proposto un editor per scrivere le istruzioni da assegnare alla proprietà. Scrivere la seguente linea: new Filtro(); e premere Ok.
La linea richiama il costruttore di una classe. Creare la classe Filtro:
class Filtro extends javax.swing.filechooser.FileFilter {
@Override
public boolean accept(File file) {
// Mostra solo cartelle o file con estensione ".txt"
return file.isDirectory() || file.getAbsolutePath().endsWith(".txt");
}
@Override
public String getDescription() {
// Questa descrizione viene mostrata nel riquadro di dialogo.
return "documenti di testo (*.txt)";
}
}
Nel file sorgente vengono segnalati degli errori, in corrispondenza di righe contenenti simboli non trovati. Posizionarsi su una di queste righe e fare clic con il tasto destro. Dal menu contestuale scegliere Fix Imports. Automaticamente vengono inserite le righe per includere le librerie necessarie, nel processo di compilazione. Infatti nella sezione intestazione verranno inserite le righe:
import java.io.File;
import java.io.FileReader;
import javax.swing.JFileChooser;
import java.io.IOException;
import javax.swing.ImageIcon;
Inserire la voce di menu Salva nel menu File.
Creare il gestore di evento della voce di menu Salva e inserire le seguenti linee:
int esito = jFileChooser2.showSaveDialog(this);
if (esito == JFileChooser.APPROVE_OPTION) {
File f = jFileChooser2.getSelectedFile();
try {
FileWriter file = new FileWriter(f, true);
PrintWriter out = new PrintWriter(file);
out.println(textarea.getText());
out.close();
} catch (IOException e) {
}
Tornare sulla scheda Design.
Aggiungere un componente label, in una zona vuota del frame, tenendo presente che dovrà contenere un'immagine di prova e quindi aumenterà di dimensioni.
Nella sezione Proprietà della classe aggiungere la seguente riga:
private ImageIcon icon;
Modificare il gestore di evento Apri:
private void ApriActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int esito = jFileChooser1.showOpenDialog(this);
if (esito == JFileChooser.APPROVE_OPTION) {
File file = jFileChooser1.getSelectedFile();
icon = new ImageIcon(file.getAbsolutePath());
jLabel1.setIcon(icon);
} else {
System.out.println("File access cancelled by user.");
}
}
Modificare il gestore dell'evento Apri:
jFileChooser1.setFileSelectionMode(JFileChooser.FILES_ONLY);
int esito = jFileChooser1.showOpenDialog(this);
if (esito == JFileChooser.APPROVE_OPTION) {
File file = jFileChooser1.getSelectedFile();
jLabel1.setText(file.getPath());
icon1 = new ImageIcon(file.getAbsolutePath());
// rilevare le misure della label
Rectangle rett = jLabel2.getBounds();
// ridimensionare la figura per adattarla nella label
Image FigInScala = icon1.getImage().getScaledInstance(rett.width, rett.height, Image.SCALE_DEFAULT);
icon1 = new ImageIcon(FigInScala);
jLabel2.setIcon(icon1);
} else {
System.out.println("Operazione annullata.");
}
Nell'esempio seguente, i due metodi, getDescription() e accept, vengono ridefiniti quando viene richiamato il costruttore della classe FileFilter. Modificare il gestore dell'evento richaimato dalla voce di menu Apri, aggiungendo le seguenti linee nella posizione indicata:
jFileChooser1.setFileSelectionMode(JFileChooser.FILES_ONLY);
// impostazione di un filtro per i file di tipo immagine
jFileChooser1.setFileFilter(new FileFilter() {
@Override
public String getDescription() {
return "Portable Network Graphics (*.png)";
}
@Override
public boolean accept(File f) {
if (f.isDirectory()) {
return true;
} else {
return f.getName().toLowerCase().endsWith(".png");
}
}
});
int esito = jFileChooser1.showOpenDialog(this);
Anche in questo caso, facendo clic destro sulla riga in cui viene segnalato l'errore "Simbolo non trovato", posizionarsi su FileFilter, premere il tasto destro, scegliere la voce Fix Imports e scegliere il file della libreria swing
Gli altri tipi di file immagine possono essere aggiunti al filtro con la seguente modifica al metodo accept():
public boolean accept(File f) {
if (f.isDirectory()) {
return true;
} else {
return f.getName().toLowerCase().endsWith(".png")
|| f.getName().toLowerCase().endsWith(".jpeg")
|| f.getName().toLowerCase().endsWith(".jpg")
|| f.getName().toLowerCase().endsWith(".gif");
}
}
Per salvare l'immagine, bisogna definire il contorno dell'area contenente l'immagine.
Se l'immagine contiene anche una didascalia allora il rettangolo di selezione deve essere esteso per contenere anche questa. La soluzione consiste nel racchiudere in un pannello tutta l'area che si vuole salvare come immagine.
Si crea un oggetto di classe rattangolo e viene inizializzato con il metodo getBounds del componente che contiene l'immagine.
In questo esempio l'immagine è contenuta in un componente Label.
Aggiungere una voce di menu Salva Immagine. Creare il relativo gestore dell'evento ed inserire le seguenti righe:
// TODO add your handling code here:
Rectangle rett = jLabel2.getBounds();
BufferedImage figura = new BufferedImage(rett.width, rett.height, BufferedImage.TYPE_INT_ARGB);
jLabel2.paint(figura.getGraphics());
jFileChooser2.setFileSelectionMode(JFileChooser.FILES_ONLY);
int esito = jFileChooser2.showSaveDialog(this);
if (esito == JFileChooser.APPROVE_OPTION) {
File file = jFileChooser2.getSelectedFile();
try {
ImageIO.write(figura, "png", file);
JOptionPane.showMessageDialog(this, "immagine salvata!",
"Operazione riuscita", JOptionPane.INFORMATION_MESSAGE);
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "Errore nel salvataggio." + ex.getMessage(),
"Operazione errata", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(this, "Operazione annullata");
}
L'utente potrebbe assegnare al file da salvare, il nome di un file esistente.
Per avvertire l'utente e chiedere l'autorizzazione a proseguire nell'operazione di salvataggio del file, si deve ridefinire il metodo approveSelection della classe FileChooser. Ad esempio come segue:
JFileChooser chooser = new JFileChooser() {
@Override
public void approveSelection() {
File f = getSelectedFile();
if (f.exists()) {
int esito = JOptionPane.showConfirmDialog(this, "Sovrascivere il file esistente?", "File esiste", JOptionPane.YES_NO_CANCEL_OPTION);
switch (esito) {
case JOptionPane.YES_OPTION:
super.approveSelection();
return;
case JOptionPane.NO_OPTION:
return;
case JOptionPane.CLOSED_OPTION:
cancelSelection();
return;
case JOptionPane.CANCEL_OPTION:
cancelSelection();
return;
}
}
super.approveSelection();
}
};
Se l'utente sceglie un nome di un file esistente, gli verrà presentato un messaggio e potrà premere uno tra 3 pulsanti: NO, nel qual caso dovrà sostituire il nome del file, SI, che conferma la sostituzione, e ANNULLA, per rotornare all'applicazionesenza salvare.
Assegnare il nome di default al fine da salvare.
La casella con il nome del file può contenere un nome del tipo "Senza-Nome-1". Il metodo setSelectedFile può essere usato per questo scopo:
jFileChooser1.setSelectedFile(new File("Senza-Nome-1.png"));
Mostrare solo cartelle.
In alcuni casi (installazione di nuovo software) interessa solo conoscere le cartelle, non interessa vedere i file contenuti. Per mostrare solo le cartelle:
jFileChooser1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
Vedere i file Nascosti.
Durante lo sviluppo di un'applicazione si potrebbe essere interessati a vedere anche i file nascosti. Per abilitare la visualizzazione nel File Chooser:
jFileChooser1.setFileHidingEnabled(false);
Disabilitare il filtro "Tutti i File": jFileChooser1.setAcceptAllFileFilterUsed(false);
Cartella di Default
La cartella di default viene aperta automaticamente, quando si richiede un'operazione che richiama il FileChooser. Può essere impostata modificando il richiamo del costruttore:
JFileChooser jFileChooser = new JFileChooser("C:\\Programmi\\MieApp");
OPPURE
File curDir = new File("C:\\Programmi\\MieApp");
jFileChooser1.setCurrentDirectory(curDir);
Siccome la tecnologia Java ha lo scopo di essere multi piattaforma, si deve sempre prevedere che l'applicazione venga eseguita sotto sistemi operativi diversi, così che il separatore "\", valido in Windows, non è valido in Unix. Questa è una possibile soluzione:
JFileChooser jFileChooser1 = new JFileChooser(System.getProperty("user.home") + System.getProperty("file.separator")+ "Immagini");
Cambiare il titolo del riquadro "Apri/Salva": jFileChooser1.setDialogTitle("Seleziona una foto");
Nella casella Navigator, fare clic dsstro su jMenuBar e scegliere la voce Add Menu.
Nella riga della proprietà Text scrivere Modifica.
Dalla Palette trascinare un componente MenuItem e rilasciarlo sul menu Modifica.
int h = icon1.getIconHeight();
int l = icon1.getIconWidth();
icon1.setImage(icon1.getImage().getScaledInstance(l*2, h*2, Image.SCALE_SMOOTH));
jLabel2.setIcon(icon1);
this.repaint();
Inserire una voce nel menu Modifica per ridurre le dimensioni dell'immagine.
Nota: l'immagine viene ridimensionata, ma potrebbe non essere mostrata nelle nuove dimensioni. In questo caso provare a ridimensionare la finestra.