MyViewChooser.java Source code

Java tutorial

Introduction

Here is the source code for MyViewChooser.java

Source

/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly 
*/
// MyViewChooser.java
//An example that uses custom file views to show thumbnails of graphic files
//rather than the regular file icon. (see ThumbnailFileView.java)
//

import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.filechooser.FileView;
import javax.swing.plaf.metal.MetalIconFactory;

public class MyViewChooser extends JFrame {
    JFrame parent;

    public MyViewChooser() {
        super("File View Test Frame");
        setSize(350, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        parent = this;

        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        JButton openButton = new JButton("Open");
        final JLabel statusbar = new JLabel("Output of your selection will go here");

        openButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();

                // Ok, set up our own file view for the chooser
                chooser.setFileView(new ThumbNailFileView(MyViewChooser.this));

                int option = chooser.showOpenDialog(parent);
                if (option == JFileChooser.APPROVE_OPTION) {
                    statusbar.setText("You chose " + chooser.getSelectedFile().getName());
                } else {
                    statusbar.setText("You cancelled.");
                }
            }
        });

        c.add(openButton);
        c.add(statusbar);
    }

    public static void main(String args[]) {
        System.setProperty("swing.defaultlaf", "javax.swing.plaf.metal.MetalLookAndFeel");
        MyViewChooser vc = new MyViewChooser();
        vc.setVisible(true);
    }
}

//ThumbNailFileView.java
//A simple implementation of the FileView class that provides a 16x16 image of
//each GIF or JPG file for its icon. This could be SLOW for large images, as we
//simply load the real image and then scale it.
//

class ThumbNailFileView extends FileView {

    private Icon fileIcon = MetalIconFactory.getTreeLeafIcon();

    private Icon folderIcon = MetalIconFactory.getTreeFolderIcon();

    private Component observer;

    public ThumbNailFileView(Component c) {
        // We need a component around to create our icon's image
        observer = c;
    }

    public String getDescription(File f) {
        // We won't store individual descriptions, so just return the
        // type description.
        return getTypeDescription(f);
    }

    public Icon getIcon(File f) {
        // Is it a folder?
        if (f.isDirectory()) {
            return folderIcon;
        }

        // Ok, it's a file, so return a custom icon if it's an image file
        String name = f.getName().toLowerCase();
        if (name.endsWith(".jpg") || name.endsWith(".gif")) {
            return new Icon16(f.getAbsolutePath());
        }

        // Return the generic file icon if it's not
        return fileIcon;
    }

    public String getName(File f) {
        String name = f.getName();
        return name.equals("") ? f.getPath() : name;
    }

    public String getTypeDescription(File f) {
        String name = f.getName().toLowerCase();
        if (f.isDirectory()) {
            return "Folder";
        }
        if (name.endsWith(".jpg")) {
            return "JPEG Image";
        }
        if (name.endsWith(".gif")) {
            return "GIF Image";
        }
        return "Generic File";
    }

    public Boolean isTraversable(File f) {
        // We'll mark all directories as traversable
        return f.isDirectory() ? Boolean.TRUE : Boolean.FALSE;
    }

    public class Icon16 extends ImageIcon {
        public Icon16(String f) {
            super(f);
            Image i = observer.createImage(16, 16);
            i.getGraphics().drawImage(getImage(), 0, 0, 16, 16, observer);
            setImage(i);
        }

        public int getIconHeight() {
            return 16;
        }

        public int getIconWidth() {
            return 16;
        }

        public void paintIcon(Component c, Graphics g, int x, int y) {
            g.drawImage(getImage(), x, y, c);
        }
    }
}