Partiamo dall'elaborato del laboratorio 5, dove un menu' a quattro voci permetteva di scegliere quale immagine mostrare, tra quattro immagini gia' caricate. Invece qui abbiamo nel menu' una sola voce "open" e l'immagine la carichiamo da file chiedendo all'utente il nome del file mediante un file chooser, elemento di interfaccia fornito da Java per muoversi nel file system alla ricerca di un file. In piu', potremmo mettere un filtro sul file chhoser, in modo che lasci scegliere solo file immagini (che riconosce guardando l'estensione, per es. gif, jpg). La soluzione senza filtro comprende il solo file LoadImages.java, cancellando la linea che contiene l'istruzione setFileFilter. La soluzione com filtro comprende entrambi i file LoadImages.java e MyFilter.java, quest'ultimo implementa il mio filtro come sotto-classe della classe astratta Java FileFilter. ============ file LoadImages.java========== Visualizza in modo alternativo, al centro della finestra, un'immagine caricata, scelta mediante. Usa la classe MyFilter (ved. dopo). import java.awt.*; import java.awt.event.*; import javax.swing.*; class LoadImages extends JFrame { /* L'inica voce di menu' presente */ JMenuItem open; /* etichetta che deve visualizzare l'immagine corrente */ JLabel lab; /* il frame che striano contruendo */ JFrame myself; public LoadImages() { myself = this; /* il menu' */ JMenu m = new JMenu("File"); open = new JMenuItem("open"); m.add(open); /* sistema menu' su barra della finestra */ JMenuBar mb = new JMenuBar(); mb.add(m); setJMenuBar(mb); /* crea label */ lab = new JLabel("Scegli immagine da menu"); /* mette label nella finestra e impacchetta */ getContentPane().setLayout(new BorderLayout()); getContentPane().add(BorderLayout.CENTER,lab); pack(); /* associa comportamento alla voce di menu' */ open.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new MyFilter()); int returnVal = chooser.showOpenDialog(myself); if(returnVal == JFileChooser.APPROVE_OPTION) { // carica immagine ImageIcon imm = new ImageIcon( chooser.getSelectedFile().getPath()); // cambia icona nella label lab.setIcon(imm); // mette nuovo preferred size secondo dimensioni figura lab.setPreferredSize(new Dimension(imm.getIconWidth(), imm.getIconHeight())); // dice alla finestra di reimpacchettarsi myself.pack(); } } }); } public static void main (String[] args) { LoadImages em = new LoadImages(); em.setVisible(true); } }; ============ file MyFilter.java========== import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.filechooser.*; import java.io.File; /* Questo filtro accetta solo directory e file con estensione gif o JPEG */ class MyFilter extends FileFilter { public boolean accept(File f) { if (f.isDirectory()) return true; '// se e' dir va bene String s = f.getName(); //nome del file if (s.endsWith(".gif")) return true; if (s.endsWith(".GIF")) return true; if (s.endsWith(".jpg")) return true; if (s.endsWith(".JPG")) return true; return false; } /* questo e' il titolo del filtro */ public String getDescription() { return "JPG and GIF Images"; } }