Mega Code Archive

 
Categories / Java / Swing JFC
 

Extends FileView to create custom File chooser

import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileView; /*  * FileChooserDemo2.java requires these files:  *   ImageFileView.java  *   ImageFilter.java  *   ImagePreview.java  *   Utils.java  *   images/jpgIcon.gif (required by ImageFileView.java)  *   images/gifIcon.gif (required by ImageFileView.java)  *   images/tiffIcon.gif (required by ImageFileView.java)  *   images/pngIcon.png (required by ImageFileView.java)  */ public class FileChooserDemo2 extends JPanel implements ActionListener {   static private String newline = "\n";   private JTextArea log;   private JFileChooser fc;   public FileChooserDemo2() {     super(new BorderLayout());     // Create the log first, because the action listener     // needs to refer to it.     log = new JTextArea(5, 20);     log.setMargin(new Insets(5, 5, 5, 5));     log.setEditable(false);     JScrollPane logScrollPane = new JScrollPane(log);     JButton sendButton = new JButton("Attach...");     sendButton.addActionListener(this);     add(sendButton, BorderLayout.PAGE_START);     add(logScrollPane, BorderLayout.CENTER);   }   public void actionPerformed(ActionEvent e) {     // Set up the file chooser.     if (fc == null) {       fc = new JFileChooser();       // Add a custom file filter and disable the default       // (Accept All) file filter.       fc.addChoosableFileFilter(new ImageFilter());       fc.setAcceptAllFileFilterUsed(false);       // Add custom icons for file types.       fc.setFileView(new ImageFileView());       // Add the preview pane.       fc.setAccessory(new ImagePreview(fc));     }     // Show it.     int returnVal = fc.showDialog(FileChooserDemo2.this, "Attach");     // Process the results.     if (returnVal == JFileChooser.APPROVE_OPTION) {       File file = fc.getSelectedFile();       log.append("Attaching file: " + file.getName() + "." + newline);     } else {       log.append("Attachment cancelled by user." + newline);     }     log.setCaretPosition(log.getDocument().getLength());     // Reset the file chooser for the next time it's shown.     fc.setSelectedFile(null);   }   /**    * Create the GUI and show it. For thread safety, this method should be    * invoked from the event dispatch thread.    */   private static void createAndShowGUI() {     // Create and set up the window.     JFrame frame = new JFrame("FileChooserDemo2");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     // Add content to the window.     frame.add(new FileChooserDemo2());     // Display the window.     frame.pack();     frame.setVisible(true);   }   public static void main(String[] args) {     // Schedule a job for the event dispatch thread:     // creating and showing this application's GUI.     SwingUtilities.invokeLater(new Runnable() {       public void run() {         // Turn off metal's use of bold fonts         UIManager.put("swing.boldMetal", Boolean.FALSE);         createAndShowGUI();       }     });   } } /*  * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.  *   * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  - Redistributions of source code must retain the above copyright notice,  * this list of conditions and the following disclaimer.  *  - Redistributions in binary form must reproduce the above copyright notice,  * this list of conditions and the following disclaimer in the documentation  * and/or other materials provided with the distribution.  *  - Neither the name of Sun Microsystems nor the names of its contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  */ class ImageFileView extends FileView {   ImageIcon jpgIcon = Utils.createImageIcon("images/jpgIcon.gif");   ImageIcon gifIcon = Utils.createImageIcon("images/gifIcon.gif");   ImageIcon tiffIcon = Utils.createImageIcon("images/tiffIcon.gif");   ImageIcon pngIcon = Utils.createImageIcon("images/pngIcon.png");   public String getName(File f) {     return null; // let the L&F FileView figure this out   }   public String getDescription(File f) {     return null; // let the L&F FileView figure this out   }   public Boolean isTraversable(File f) {     return null; // let the L&F FileView figure this out   }   public String getTypeDescription(File f) {     String extension = Utils.getExtension(f);     String type = null;     if (extension != null) {       if (extension.equals(Utils.jpeg) || extension.equals(Utils.jpg)) {         type = "JPEG Image";       } else if (extension.equals(Utils.gif)) {         type = "GIF Image";       } else if (extension.equals(Utils.tiff) || extension.equals(Utils.tif)) {         type = "TIFF Image";       } else if (extension.equals(Utils.png)) {         type = "PNG Image";       }     }     return type;   }   public Icon getIcon(File f) {     String extension = Utils.getExtension(f);     Icon icon = null;     if (extension != null) {       if (extension.equals(Utils.jpeg) || extension.equals(Utils.jpg)) {         icon = jpgIcon;       } else if (extension.equals(Utils.gif)) {         icon = gifIcon;       } else if (extension.equals(Utils.tiff) || extension.equals(Utils.tif)) {         icon = tiffIcon;       } else if (extension.equals(Utils.png)) {         icon = pngIcon;       }     }     return icon;   } } /*  * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.  *   * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  - Redistributions of source code must retain the above copyright notice,  * this list of conditions and the following disclaimer.  *  - Redistributions in binary form must reproduce the above copyright notice,  * this list of conditions and the following disclaimer in the documentation  * and/or other materials provided with the distribution.  *  - Neither the name of Sun Microsystems nor the names of its contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  */ class ImageFilter extends FileFilter {   // Accept all directories and all gif, jpg, tiff, or png files.   public boolean accept(File f) {     if (f.isDirectory()) {       return true;     }     String extension = Utils.getExtension(f);     if (extension != null) {       if (extension.equals(Utils.tiff) || extension.equals(Utils.tif)           || extension.equals(Utils.gif) || extension.equals(Utils.jpeg)           || extension.equals(Utils.jpg) || extension.equals(Utils.png)) {         return true;       } else {         return false;       }     }     return false;   }   // The description of this filter   public String getDescription() {     return "Just Images";   } } /*  * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.  *   * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  - Redistributions of source code must retain the above copyright notice,  * this list of conditions and the following disclaimer.  *  - Redistributions in binary form must reproduce the above copyright notice,  * this list of conditions and the following disclaimer in the documentation  * and/or other materials provided with the distribution.  *  - Neither the name of Sun Microsystems nor the names of its contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  */ class ImagePreview extends JComponent implements PropertyChangeListener {   ImageIcon thumbnail = null;   File file = null;   public ImagePreview(JFileChooser fc) {     setPreferredSize(new Dimension(100, 50));     fc.addPropertyChangeListener(this);   }   public void loadImage() {     if (file == null) {       thumbnail = null;       return;     }     // Don't use createImageIcon (which is a wrapper for getResource)     // because the image we're trying to load is probably not one     // of this program's own resources.     ImageIcon tmpIcon = new ImageIcon(file.getPath());     if (tmpIcon != null) {       if (tmpIcon.getIconWidth() > 90) {         thumbnail = new ImageIcon(tmpIcon.getImage().getScaledInstance(90, -1,             Image.SCALE_DEFAULT));       } else { // no need to miniaturize         thumbnail = tmpIcon;       }     }   }   public void propertyChange(PropertyChangeEvent e) {     boolean update = false;     String prop = e.getPropertyName();     // If the directory changed, don't show an image.     if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {       file = null;       update = true;       // If a file became selected, find out which one.     } else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {       file = (File) e.getNewValue();       update = true;     }     // Update the preview accordingly.     if (update) {       thumbnail = null;       if (isShowing()) {         loadImage();         repaint();       }     }   }   protected void paintComponent(Graphics g) {     if (thumbnail == null) {       loadImage();     }     if (thumbnail != null) {       int x = getWidth() / 2 - thumbnail.getIconWidth() / 2;       int y = getHeight() / 2 - thumbnail.getIconHeight() / 2;       if (y < 0) {         y = 0;       }       if (x < 5) {         x = 5;       }       thumbnail.paintIcon(this, g, x, y);     }   } } /*  * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.  *   * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  - Redistributions of source code must retain the above copyright notice,  * this list of conditions and the following disclaimer.  *  - Redistributions in binary form must reproduce the above copyright notice,  * this list of conditions and the following disclaimer in the documentation  * and/or other materials provided with the distribution.  *  - Neither the name of Sun Microsystems nor the names of its contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  */ /* Utils.java is used by FileChooserDemo2.java. */ class Utils {   public final static String jpeg = "jpeg";   public final static String jpg = "jpg";   public final static String gif = "gif";   public final static String tiff = "tiff";   public final static String tif = "tif";   public final static String png = "png";   /*    * Get the extension of a file.    */   public static String getExtension(File f) {     String ext = null;     String s = f.getName();     int i = s.lastIndexOf('.');     if (i > 0 && i < s.length() - 1) {       ext = s.substring(i + 1).toLowerCase();     }     return ext;   }   /** Returns an ImageIcon, or null if the path was invalid. */   protected static ImageIcon createImageIcon(String path) {     java.net.URL imgURL = Utils.class.getResource(path);     if (imgURL != null) {       return new ImageIcon(imgURL);     } else {       System.err.println("Couldn't find file: " + path);       return null;     }   } }