JFileChooser class in action with an accessory
/*
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();
}
}
}
Related examples in the same category