AccessoryFileChooser.java Source code

Java tutorial

Introduction

Here is the source code for AccessoryFileChooser.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 
*/
// AccessoryFileChooser.java
//An example of the JFileChooser class in action with an accessory. This
//accessory (see AudioAccessory.java) will play simple audio files within
//the file chooser.
//

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class AccessoryFileChooser extends JFrame {
    JFileChooser chooser = null;

    JLabel statusbar;

    public AccessoryFileChooser() {
        super("Accessory Test Frame");
        setSize(350, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        JButton accButton = new JButton("Accessory");
        statusbar = new JLabel("Output of your selection will go here");
        chooser = new JFileChooser();
        AudioAccessory aa = new AudioAccessory();
        chooser.setAccessory(aa);
        chooser.addPropertyChangeListener(aa); // to receive selection changes
        chooser.addActionListener(aa); // to receive approve/cancel button
        // events

        accButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                int option = chooser.showOpenDialog(AccessoryFileChooser.this);
                if (option == JFileChooser.APPROVE_OPTION) {
                    statusbar.setText("You chose "
                            + ((chooser.getSelectedFile() != null) ? chooser.getSelectedFile().getName()
                                    : "nothing"));
                } else {
                    statusbar.setText("You canceled.");
                }
            }
        });
        c.add(accButton);
        c.add(statusbar);
    }

    public static void main(String args[]) {
        AccessoryFileChooser afc = new AccessoryFileChooser();
        afc.setVisible(true);
    }
}

//AudioAccessory.java
//An accessory for JFileChooser that lets you play music clips. Only the
//simple .au, .aiff and .wav formats available through the Applet sound
//classes can be played.
//

class AudioAccessory extends JPanel implements PropertyChangeListener, ActionListener {

    AudioClip currentClip;

    String currentName = "";

    JLabel fileLabel;

    JButton playButton, stopButton;

    public AudioAccessory() {
        // Set up the accessory. The file chooser will give us a reasonable
        // size.
        setLayout(new BorderLayout());
        add(fileLabel = new JLabel("Clip Name"), BorderLayout.NORTH);
        JPanel p = new JPanel();
        playButton = new JButton("Play");
        stopButton = new JButton("Stop");
        playButton.setEnabled(false);
        stopButton.setEnabled(false);
        p.add(playButton);
        p.add(stopButton);
        add(p, BorderLayout.CENTER);

        playButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (currentClip != null) {
                    currentClip.stop();
                    currentClip.play();
                }
            }
        });
        stopButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (currentClip != null) {
                    currentClip.stop();
                }
            }
        });
    }

    public void propertyChange(PropertyChangeEvent e) {
        String pname = e.getPropertyName();
        if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(pname)) {
            // Ok, the user selected a file in the chooser
            File f = (File) e.getNewValue();

            // Make reasonably sure it's an audio file
            if ((f != null) && (f.getName().toLowerCase().endsWith(".au")
                    || f.getName().toLowerCase().endsWith(".wav") || f.getName().toLowerCase().endsWith(".aif")
                    || f.getName().toLowerCase().endsWith(".aiff"))) {
                setCurrentClip(f);
            } else {
                setCurrentClip(null);
            }
        }
    }

    public void setCurrentClip(File f) {
        if (currentClip != null) {
            currentClip.stop();
        }
        // Make sure we have a real file, otherwise, disable the buttons
        if ((f == null) || (f.getName() == null)) {
            fileLabel.setText("no audio selected");
            playButton.setEnabled(false);
            stopButton.setEnabled(false);
            return;
        }

        // Ok, seems the audio file is real, so load it and enable the buttons
        String name = f.getName();
        if (name.equals(currentName)) {
            // Same clip they just loaded...make sure the player is enabled
            fileLabel.setText(name);
            playButton.setEnabled(true);
            stopButton.setEnabled(true);
            return;
        }
        currentName = name;
        try {
            URL u = new URL("file:///" + f.getAbsolutePath());
            currentClip = Applet.newAudioClip(u);
        } catch (Exception e) {
            e.printStackTrace();
            currentClip = null;
            fileLabel.setText("Error loading clip.");
        }
        fileLabel.setText(name);
        playButton.setEnabled(true);
        stopButton.setEnabled(true);
    }

    public void actionPerformed(ActionEvent ae) {
        // Be a little cavalier here...we're assuming the dialog was just
        // approved or cancelled so we should stop any playing clip
        if (currentClip != null) {
            currentClip.stop();
        }
    }
}