--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/demo/share/jfc/FileChooserDemo/FileChooserDemo.java Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,850 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. 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 Oracle 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.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.UIManager.LookAndFeelInfo;
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Component;
+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.util.List;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+import javax.swing.JToggleButton;
+import javax.swing.LookAndFeel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.WindowConstants;
+import javax.swing.filechooser.FileFilter;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import javax.swing.filechooser.FileSystemView;
+import java.util.ArrayList;
+import javax.swing.plaf.FileChooserUI;
+import javax.swing.plaf.basic.BasicFileChooserUI;
+import java.io.File;
+import static javax.swing.JFileChooser.*;
+
+
+/**
+ *
+ * A demo which makes extensive use of the file chooser.
+ *
+ * @author Jeff Dinkins
+ */
+@SuppressWarnings("serial")
+public class FileChooserDemo extends JPanel implements ActionListener {
+
+ public static final String NIMBUS_LAF_NAME = "Nimbus";
+ private static JFrame frame;
+ private final List<SupportedLaF> supportedLaFs =
+ new ArrayList<SupportedLaF>();
+ private static SupportedLaF nimbusLaF;
+
+
+ private static class SupportedLaF {
+
+ private final String name;
+ private final LookAndFeel laf;
+
+ SupportedLaF(String name, LookAndFeel laf) {
+ this.name = name;
+ this.laf = laf;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+ private JButton showButton;
+ private JCheckBox showAllFilesFilterCheckBox;
+ private JCheckBox showImageFilesFilterCheckBox;
+ private JCheckBox showFullDescriptionCheckBox;
+ private JCheckBox useFileViewCheckBox;
+ private JCheckBox useFileSystemViewCheckBox;
+ private JCheckBox accessoryCheckBox;
+ private JCheckBox setHiddenCheckBox;
+ private JCheckBox useEmbedInWizardCheckBox;
+ private JCheckBox useControlsCheckBox;
+ private JCheckBox enableDragCheckBox;
+ private JRadioButton singleSelectionRadioButton;
+ private JRadioButton multiSelectionRadioButton;
+ private JRadioButton openRadioButton;
+ private JRadioButton saveRadioButton;
+ private JRadioButton customButton;
+ private JComboBox lafComboBox;
+ private JRadioButton justFilesRadioButton;
+ private JRadioButton justDirectoriesRadioButton;
+ private JRadioButton bothFilesAndDirectoriesRadioButton;
+ private JTextField customField;
+ private final ExampleFileView fileView;
+ private final ExampleFileSystemView fileSystemView;
+ private static final Dimension hpad10 = new Dimension(10, 1);
+ private static final Dimension vpad20 = new Dimension(1, 20);
+ private static final Dimension vpad7 = new Dimension(1, 7);
+ private static final Dimension vpad4 = new Dimension(1, 4);
+ private static final Insets insets = new Insets(5, 10, 0, 10);
+ private final FilePreviewer previewer;
+ private final JFileChooser chooser;
+
+ @SuppressWarnings("LeakingThisInConstructor")
+ public FileChooserDemo() {
+ UIManager.LookAndFeelInfo[] installedLafs = UIManager.
+ getInstalledLookAndFeels();
+ for (UIManager.LookAndFeelInfo lafInfo : installedLafs) {
+ try {
+ Class<?> lnfClass = Class.forName(lafInfo.getClassName());
+ LookAndFeel laf = (LookAndFeel) (lnfClass.newInstance());
+ if (laf.isSupportedLookAndFeel()) {
+ String name = lafInfo.getName();
+ SupportedLaF supportedLaF = new SupportedLaF(name, laf);
+ supportedLaFs.add(supportedLaF);
+ if (NIMBUS_LAF_NAME.equals(name)) {
+ nimbusLaF = supportedLaF;
+ }
+ }
+ } catch (Exception ignored) {
+ // If ANYTHING weird happens, don't add this L&F
+ }
+ }
+
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+ chooser = new JFileChooser();
+ previewer = new FilePreviewer(chooser);
+
+ // Create Custom FileView
+ fileView = new ExampleFileView();
+ fileView.putIcon("jpg", new ImageIcon(getClass().getResource(
+ "/resources/images/jpgIcon.jpg")));
+ fileView.putIcon("gif", new ImageIcon(getClass().getResource(
+ "/resources/images/gifIcon.gif")));
+
+ // Create Custom FileSystemView
+ fileSystemView = new ExampleFileSystemView();
+
+ // create a radio listener to listen to option changes
+ OptionListener optionListener = new OptionListener();
+
+ // Create options
+ openRadioButton = new JRadioButton("Open");
+ openRadioButton.setSelected(true);
+ openRadioButton.addActionListener(optionListener);
+
+ saveRadioButton = new JRadioButton("Save");
+ saveRadioButton.addActionListener(optionListener);
+
+ customButton = new JRadioButton("Custom");
+ customButton.addActionListener(optionListener);
+
+ customField = new JTextField(8) {
+
+ @Override
+ public Dimension getMaximumSize() {
+ return new Dimension(getPreferredSize().width,
+ getPreferredSize().height);
+ }
+ };
+ customField.setText("Doit");
+ customField.setAlignmentY(JComponent.TOP_ALIGNMENT);
+ customField.setEnabled(false);
+ customField.addActionListener(optionListener);
+
+ ButtonGroup group1 = new ButtonGroup();
+ group1.add(openRadioButton);
+ group1.add(saveRadioButton);
+ group1.add(customButton);
+
+ // filter buttons
+ showAllFilesFilterCheckBox = new JCheckBox("Show \"All Files\" Filter");
+ showAllFilesFilterCheckBox.addActionListener(optionListener);
+ showAllFilesFilterCheckBox.setSelected(true);
+
+ showImageFilesFilterCheckBox = new JCheckBox("Show JPG and GIF Filters");
+ showImageFilesFilterCheckBox.addActionListener(optionListener);
+ showImageFilesFilterCheckBox.setSelected(false);
+
+ accessoryCheckBox = new JCheckBox("Show Preview");
+ accessoryCheckBox.addActionListener(optionListener);
+ accessoryCheckBox.setSelected(false);
+
+ // more options
+ setHiddenCheckBox = new JCheckBox("Show Hidden Files");
+ setHiddenCheckBox.addActionListener(optionListener);
+
+ showFullDescriptionCheckBox = new JCheckBox("With File Extensions");
+ showFullDescriptionCheckBox.addActionListener(optionListener);
+ showFullDescriptionCheckBox.setSelected(true);
+ showFullDescriptionCheckBox.setEnabled(false);
+
+ useFileViewCheckBox = new JCheckBox("Use FileView");
+ useFileViewCheckBox.addActionListener(optionListener);
+ useFileViewCheckBox.setSelected(false);
+
+ useFileSystemViewCheckBox = new JCheckBox("Use FileSystemView", false);
+ useFileSystemViewCheckBox.addActionListener(optionListener);
+
+ useEmbedInWizardCheckBox = new JCheckBox("Embed in Wizard");
+ useEmbedInWizardCheckBox.addActionListener(optionListener);
+ useEmbedInWizardCheckBox.setSelected(false);
+
+ useControlsCheckBox = new JCheckBox("Show Control Buttons");
+ useControlsCheckBox.addActionListener(optionListener);
+ useControlsCheckBox.setSelected(true);
+
+ enableDragCheckBox = new JCheckBox("Enable Dragging");
+ enableDragCheckBox.addActionListener(optionListener);
+
+ // File or Directory chooser options
+ ButtonGroup group3 = new ButtonGroup();
+ justFilesRadioButton = new JRadioButton("Just Select Files");
+ justFilesRadioButton.setSelected(true);
+ group3.add(justFilesRadioButton);
+ justFilesRadioButton.addActionListener(optionListener);
+
+ justDirectoriesRadioButton = new JRadioButton("Just Select Directories");
+ group3.add(justDirectoriesRadioButton);
+ justDirectoriesRadioButton.addActionListener(optionListener);
+
+ bothFilesAndDirectoriesRadioButton = new JRadioButton(
+ "Select Files or Directories");
+ group3.add(bothFilesAndDirectoriesRadioButton);
+ bothFilesAndDirectoriesRadioButton.addActionListener(optionListener);
+
+ singleSelectionRadioButton = new JRadioButton("Single Selection", true);
+ singleSelectionRadioButton.addActionListener(optionListener);
+
+ multiSelectionRadioButton = new JRadioButton("Multi Selection");
+ multiSelectionRadioButton.addActionListener(optionListener);
+
+ ButtonGroup group4 = new ButtonGroup();
+ group4.add(singleSelectionRadioButton);
+ group4.add(multiSelectionRadioButton);
+
+
+ // Create show button
+ showButton = new JButton("Show FileChooser");
+ showButton.addActionListener(this);
+ showButton.setMnemonic('s');
+
+ // Create laf combo box
+ lafComboBox = new JComboBox(supportedLaFs.toArray());
+ lafComboBox.setSelectedItem(nimbusLaF);
+ lafComboBox.setEditable(false);
+ lafComboBox.addActionListener(optionListener);
+
+ // ********************************************************
+ // ******************** Dialog Type ***********************
+ // ********************************************************
+ JPanel control1 = new InsetPanel(insets);
+ control1.setBorder(BorderFactory.createTitledBorder("Dialog Type"));
+
+ control1.setLayout(new BoxLayout(control1, BoxLayout.Y_AXIS));
+ control1.add(Box.createRigidArea(vpad20));
+ control1.add(openRadioButton);
+ control1.add(Box.createRigidArea(vpad7));
+ control1.add(saveRadioButton);
+ control1.add(Box.createRigidArea(vpad7));
+ control1.add(customButton);
+ control1.add(Box.createRigidArea(vpad4));
+ JPanel fieldWrapper = new JPanel();
+ fieldWrapper.setLayout(new BoxLayout(fieldWrapper, BoxLayout.X_AXIS));
+ fieldWrapper.setAlignmentX(Component.LEFT_ALIGNMENT);
+ fieldWrapper.add(Box.createRigidArea(hpad10));
+ fieldWrapper.add(Box.createRigidArea(hpad10));
+ fieldWrapper.add(customField);
+ control1.add(fieldWrapper);
+ control1.add(Box.createRigidArea(vpad20));
+ control1.add(Box.createGlue());
+
+ // ********************************************************
+ // ***************** Filter Controls **********************
+ // ********************************************************
+ JPanel control2 = new InsetPanel(insets);
+ control2.setBorder(BorderFactory.createTitledBorder("Filter Controls"));
+ control2.setLayout(new BoxLayout(control2, BoxLayout.Y_AXIS));
+ control2.add(Box.createRigidArea(vpad20));
+ control2.add(showAllFilesFilterCheckBox);
+ control2.add(Box.createRigidArea(vpad7));
+ control2.add(showImageFilesFilterCheckBox);
+ control2.add(Box.createRigidArea(vpad4));
+ JPanel checkWrapper = new JPanel();
+ checkWrapper.setLayout(new BoxLayout(checkWrapper, BoxLayout.X_AXIS));
+ checkWrapper.setAlignmentX(Component.LEFT_ALIGNMENT);
+ checkWrapper.add(Box.createRigidArea(hpad10));
+ checkWrapper.add(Box.createRigidArea(hpad10));
+ checkWrapper.add(showFullDescriptionCheckBox);
+ control2.add(checkWrapper);
+ control2.add(Box.createRigidArea(vpad20));
+ control2.add(Box.createGlue());
+
+ // ********************************************************
+ // ****************** Display Options *********************
+ // ********************************************************
+ JPanel control3 = new InsetPanel(insets);
+ control3.setBorder(BorderFactory.createTitledBorder("Display Options"));
+ control3.setLayout(new BoxLayout(control3, BoxLayout.Y_AXIS));
+ control3.add(Box.createRigidArea(vpad20));
+ control3.add(setHiddenCheckBox);
+ control3.add(Box.createRigidArea(vpad7));
+ control3.add(useFileViewCheckBox);
+ control3.add(Box.createRigidArea(vpad7));
+ control3.add(useFileSystemViewCheckBox);
+ control3.add(Box.createRigidArea(vpad7));
+ control3.add(accessoryCheckBox);
+ control3.add(Box.createRigidArea(vpad7));
+ control3.add(useEmbedInWizardCheckBox);
+ control3.add(Box.createRigidArea(vpad7));
+ control3.add(useControlsCheckBox);
+ control3.add(Box.createRigidArea(vpad7));
+ control3.add(enableDragCheckBox);
+ control3.add(Box.createRigidArea(vpad20));
+ control3.add(Box.createGlue());
+
+ // ********************************************************
+ // ************* File & Directory Options *****************
+ // ********************************************************
+ JPanel control4 = new InsetPanel(insets);
+ control4.setBorder(BorderFactory.createTitledBorder(
+ "File and Directory Options"));
+ control4.setLayout(new BoxLayout(control4, BoxLayout.Y_AXIS));
+ control4.add(Box.createRigidArea(vpad20));
+ control4.add(justFilesRadioButton);
+ control4.add(Box.createRigidArea(vpad7));
+ control4.add(justDirectoriesRadioButton);
+ control4.add(Box.createRigidArea(vpad7));
+ control4.add(bothFilesAndDirectoriesRadioButton);
+ control4.add(Box.createRigidArea(vpad20));
+ control4.add(singleSelectionRadioButton);
+ control4.add(Box.createRigidArea(vpad7));
+ control4.add(multiSelectionRadioButton);
+ control4.add(Box.createRigidArea(vpad20));
+ control4.add(Box.createGlue());
+
+
+ // ********************************************************
+ // **************** Look & Feel Switch ********************
+ // ********************************************************
+ JPanel panel = new JPanel();
+ panel.add(new JLabel("Look and Feel: "));
+ panel.add(lafComboBox);
+ panel.add(showButton);
+
+ // ********************************************************
+ // ****************** Wrap 'em all up *********************
+ // ********************************************************
+ JPanel wrapper = new JPanel();
+ wrapper.setLayout(new BoxLayout(wrapper, BoxLayout.X_AXIS));
+
+ add(Box.createRigidArea(vpad20));
+
+ wrapper.add(Box.createRigidArea(hpad10));
+ wrapper.add(Box.createRigidArea(hpad10));
+ wrapper.add(control1);
+ wrapper.add(Box.createRigidArea(hpad10));
+ wrapper.add(control2);
+ wrapper.add(Box.createRigidArea(hpad10));
+ wrapper.add(control3);
+ wrapper.add(Box.createRigidArea(hpad10));
+ wrapper.add(control4);
+ wrapper.add(Box.createRigidArea(hpad10));
+ wrapper.add(Box.createRigidArea(hpad10));
+
+ add(wrapper);
+ add(Box.createRigidArea(vpad20));
+ add(panel);
+ add(Box.createRigidArea(vpad20));
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (customButton.isSelected()) {
+ chooser.setApproveButtonText(customField.getText());
+ }
+ if (chooser.isMultiSelectionEnabled()) {
+ chooser.setSelectedFiles(null);
+ } else {
+ chooser.setSelectedFile(null);
+ }
+ // clear the preview from the previous display of the chooser
+ JComponent accessory = chooser.getAccessory();
+ if (accessory != null) {
+ ((FilePreviewer) accessory).loadImage(null);
+ }
+
+ if (useEmbedInWizardCheckBox.isSelected()) {
+ WizardDialog wizard = new WizardDialog(frame, true);
+ wizard.setVisible(true);
+ wizard.dispose();
+ return;
+ }
+
+ int retval = chooser.showDialog(frame, null);
+ if (retval == APPROVE_OPTION) {
+ JOptionPane.showMessageDialog(frame, getResultString());
+ } else if (retval == CANCEL_OPTION) {
+ JOptionPane.showMessageDialog(frame,
+ "User cancelled operation. No file was chosen.");
+ } else if (retval == ERROR_OPTION) {
+ JOptionPane.showMessageDialog(frame,
+ "An error occurred. No file was chosen.");
+ } else {
+ JOptionPane.showMessageDialog(frame, "Unknown operation occurred.");
+ }
+ }
+
+ private void resetFileFilters(boolean enableFilters,
+ boolean showExtensionInDescription) {
+ chooser.resetChoosableFileFilters();
+ if (enableFilters) {
+ FileFilter jpgFilter = createFileFilter(
+ "JPEG Compressed Image Files",
+ showExtensionInDescription, "jpg");
+ FileFilter gifFilter = createFileFilter("GIF Image Files",
+ showExtensionInDescription, "gif");
+ FileFilter bothFilter = createFileFilter("JPEG and GIF Image Files",
+ showExtensionInDescription, "jpg",
+ "gif");
+ chooser.addChoosableFileFilter(bothFilter);
+ chooser.addChoosableFileFilter(jpgFilter);
+ chooser.addChoosableFileFilter(gifFilter);
+ }
+ }
+
+ private FileFilter createFileFilter(String description,
+ boolean showExtensionInDescription, String... extensions) {
+ if (showExtensionInDescription) {
+ description = createFileNameFilterDescriptionFromExtensions(
+ description, extensions);
+ }
+ return new FileNameExtensionFilter(description, extensions);
+ }
+
+ private String createFileNameFilterDescriptionFromExtensions(
+ String description, String[] extensions) {
+ String fullDescription = (description == null) ? "(" : description
+ + " (";
+ // build the description from the extension list
+ fullDescription += "." + extensions[0];
+ for (int i = 1; i < extensions.length; i++) {
+ fullDescription += ", .";
+ fullDescription += extensions[i];
+ }
+ fullDescription += ")";
+ return fullDescription;
+ }
+
+
+ private class WizardDialog extends JDialog implements ActionListener {
+
+ CardLayout cardLayout;
+ JPanel cardPanel;
+ JLabel messageLabel;
+ JButton backButton, nextButton, closeButton;
+
+ @SuppressWarnings("LeakingThisInConstructor")
+ WizardDialog(JFrame frame, boolean modal) {
+ super(frame, "Embedded JFileChooser Demo", modal);
+
+ cardLayout = new CardLayout();
+ cardPanel = new JPanel(cardLayout);
+ getContentPane().add(cardPanel, BorderLayout.CENTER);
+
+ messageLabel = new JLabel("", JLabel.CENTER);
+ cardPanel.add(chooser, "fileChooser");
+ cardPanel.add(messageLabel, "label");
+ cardLayout.show(cardPanel, "fileChooser");
+ chooser.addActionListener(this);
+
+ JPanel buttonPanel = new JPanel();
+ backButton = new JButton("< Back");
+ nextButton = new JButton("Next >");
+ closeButton = new JButton("Close");
+
+ buttonPanel.add(backButton);
+ buttonPanel.add(nextButton);
+ buttonPanel.add(closeButton);
+
+ getContentPane().add(buttonPanel, BorderLayout.SOUTH);
+
+ backButton.setEnabled(false);
+ getRootPane().setDefaultButton(nextButton);
+
+ backButton.addActionListener(this);
+ nextButton.addActionListener(this);
+ closeButton.addActionListener(this);
+
+ pack();
+ setLocationRelativeTo(frame);
+ }
+
+ public void actionPerformed(ActionEvent evt) {
+ Object src = evt.getSource();
+ String cmd = evt.getActionCommand();
+
+ if (src == backButton) {
+ back();
+ } else if (src == nextButton) {
+ FileChooserUI ui = chooser.getUI();
+ if (ui instanceof BasicFileChooserUI) {
+ // Workaround for bug 4528663. This is necessary to
+ // pick up the contents of the file chooser text field.
+ // This will trigger an APPROVE_SELECTION action.
+ ((BasicFileChooserUI) ui).getApproveSelectionAction().
+ actionPerformed(null);
+ } else {
+ next();
+ }
+ } else if (src == closeButton) {
+ close();
+ } else if (APPROVE_SELECTION.equals(cmd)) {
+ next();
+ } else if (CANCEL_SELECTION.equals(cmd)) {
+ close();
+ }
+ }
+
+ private void back() {
+ backButton.setEnabled(false);
+ nextButton.setEnabled(true);
+ cardLayout.show(cardPanel, "fileChooser");
+ getRootPane().setDefaultButton(nextButton);
+ chooser.requestFocus();
+ }
+
+ private void next() {
+ backButton.setEnabled(true);
+ nextButton.setEnabled(false);
+ messageLabel.setText(getResultString());
+ cardLayout.show(cardPanel, "label");
+ getRootPane().setDefaultButton(closeButton);
+ closeButton.requestFocus();
+ }
+
+ private void close() {
+ setVisible(false);
+ }
+
+ @Override
+ public void dispose() {
+ chooser.removeActionListener(this);
+
+ // The chooser is hidden by CardLayout on remove
+ // so fix it here
+ cardPanel.remove(chooser);
+ chooser.setVisible(true);
+
+ super.dispose();
+ }
+ }
+
+ private String getResultString() {
+ String resultString;
+ String filter;
+ if (chooser.getFileFilter() == null) {
+ filter = "";
+ } else {
+ filter = chooser.getFileFilter().getDescription();
+ }
+ String path = null;
+ boolean isDirMode = (chooser.getFileSelectionMode() == DIRECTORIES_ONLY);
+ boolean isMulti = chooser.isMultiSelectionEnabled();
+
+ if (isMulti) {
+ File[] files = chooser.getSelectedFiles();
+ if (files != null && files.length > 0) {
+ path = "";
+ for (File file : files) {
+ path = path + "<br>" + file.getPath();
+ }
+ }
+ } else {
+ File file = chooser.getSelectedFile();
+ if (file != null) {
+ path = "<br>" + file.getPath();
+ }
+ }
+ if (path != null) {
+ path = path.replace(" ", " ");
+ filter = filter.replace(" ", " ");
+ resultString =
+ "<html>You chose " + (isMulti ? "these" : "this") + " " + (isDirMode ? (isMulti
+ ? "directories" : "directory")
+ : (isMulti ? "files" : "file")) + ": <code>" + path
+ + "</code><br><br>with filter: <br><code>" + filter;
+ } else {
+ resultString = "Nothing was chosen";
+ }
+ return resultString;
+ }
+
+
+ /** An ActionListener that listens to the radio buttons. */
+ private class OptionListener implements ActionListener {
+
+ public void actionPerformed(ActionEvent e) {
+ JComponent c = (JComponent) e.getSource();
+ boolean selected = false;
+ if (c instanceof JToggleButton) {
+ selected = ((JToggleButton) c).isSelected();
+ }
+
+ if (c == openRadioButton) {
+ chooser.setDialogType(OPEN_DIALOG);
+ customField.setEnabled(false);
+ repaint();
+ } else if (c == useEmbedInWizardCheckBox) {
+ useControlsCheckBox.setEnabled(!selected);
+ useControlsCheckBox.setSelected(!selected);
+ chooser.setControlButtonsAreShown(!selected);
+ } else if (c == useControlsCheckBox) {
+ chooser.setControlButtonsAreShown(selected);
+ } else if (c == enableDragCheckBox) {
+ chooser.setDragEnabled(selected);
+ } else if (c == saveRadioButton) {
+ chooser.setDialogType(SAVE_DIALOG);
+ customField.setEnabled(false);
+ repaint();
+ } else if (c == customButton || c == customField) {
+ customField.setEnabled(true);
+ chooser.setDialogType(CUSTOM_DIALOG);
+ repaint();
+ } else if (c == showAllFilesFilterCheckBox) {
+ chooser.setAcceptAllFileFilterUsed(selected);
+ } else if (c == showImageFilesFilterCheckBox) {
+ resetFileFilters(selected,
+ showFullDescriptionCheckBox.isSelected());
+ showFullDescriptionCheckBox.setEnabled(selected);
+ } else if (c == setHiddenCheckBox) {
+ chooser.setFileHidingEnabled(!selected);
+ } else if (c == accessoryCheckBox) {
+ if (selected) {
+ chooser.setAccessory(previewer);
+ } else {
+ chooser.setAccessory(null);
+ }
+ } else if (c == useFileViewCheckBox) {
+ if (selected) {
+ chooser.setFileView(fileView);
+ } else {
+ chooser.setFileView(null);
+ }
+ } else if (c == useFileSystemViewCheckBox) {
+ if (selected) {
+ chooser.setFileSystemView(fileSystemView);
+ } else {
+ // Restore default behaviour
+ chooser.setFileSystemView(FileSystemView.getFileSystemView());
+ }
+ } else if (c == showFullDescriptionCheckBox) {
+ resetFileFilters(showImageFilesFilterCheckBox.isSelected(),
+ selected);
+ } else if (c == justFilesRadioButton) {
+ chooser.setFileSelectionMode(FILES_ONLY);
+ } else if (c == justDirectoriesRadioButton) {
+ chooser.setFileSelectionMode(DIRECTORIES_ONLY);
+ } else if (c == bothFilesAndDirectoriesRadioButton) {
+ chooser.setFileSelectionMode(FILES_AND_DIRECTORIES);
+ } else if (c == singleSelectionRadioButton) {
+ if (selected) {
+ chooser.setMultiSelectionEnabled(false);
+ }
+ } else if (c == multiSelectionRadioButton) {
+ if (selected) {
+ chooser.setMultiSelectionEnabled(true);
+ }
+ } else if (c == lafComboBox) {
+ SupportedLaF supportedLaF = ((SupportedLaF) lafComboBox.
+ getSelectedItem());
+ LookAndFeel laf = supportedLaF.laf;
+ try {
+ UIManager.setLookAndFeel(laf);
+ SwingUtilities.updateComponentTreeUI(frame);
+ if (chooser != null) {
+ SwingUtilities.updateComponentTreeUI(chooser);
+ }
+ frame.pack();
+ } catch (UnsupportedLookAndFeelException exc) {
+ // This should not happen because we already checked
+ ((DefaultComboBoxModel) lafComboBox.getModel()).
+ removeElement(supportedLaF);
+ }
+ }
+
+ }
+ }
+
+
+ private class FilePreviewer extends JComponent implements
+ PropertyChangeListener {
+
+ ImageIcon thumbnail = null;
+
+ @SuppressWarnings("LeakingThisInConstructor")
+ public FilePreviewer(JFileChooser fc) {
+ setPreferredSize(new Dimension(100, 50));
+ fc.addPropertyChangeListener(this);
+ }
+
+ public void loadImage(File f) {
+ if (f == null) {
+ thumbnail = null;
+ } else {
+ ImageIcon tmpIcon = new ImageIcon(f.getPath());
+ if (tmpIcon.getIconWidth() > 90) {
+ thumbnail = new ImageIcon(
+ tmpIcon.getImage().getScaledInstance(90, -1,
+ Image.SCALE_DEFAULT));
+ } else {
+ thumbnail = tmpIcon;
+ }
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent e) {
+ String prop = e.getPropertyName();
+ if (SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
+ if (isShowing()) {
+ loadImage((File) e.getNewValue());
+ repaint();
+ }
+ }
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ 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);
+ }
+ }
+ }
+
+ public static void main(String s[]) {
+ try {
+ SwingUtilities.invokeAndWait(new Runnable() {
+
+ public void run() {
+ /*
+ * NOTE: By default, the look and feel will be set to the
+ * Cross Platform Look and Feel (which is currently Metal).
+ * The following code tries to set the Look and Feel to Nimbus.
+ * http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/nimbus.html
+ */
+ try {
+ for (LookAndFeelInfo info : UIManager.
+ getInstalledLookAndFeels()) {
+ if (NIMBUS_LAF_NAME.equals(info.getName())) {
+ UIManager.setLookAndFeel(info.getClassName());
+ break;
+ }
+ }
+ } catch (Exception ignored) {
+ }
+
+ FileChooserDemo panel = new FileChooserDemo();
+
+ frame = new JFrame("FileChooserDemo");
+ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ frame.getContentPane().add("Center", panel);
+ frame.pack();
+ frame.setVisible(true);
+ }
+ });
+ } catch (InterruptedException ex) {
+ Logger.getLogger(FileChooserDemo.class.getName()).log(Level.SEVERE,
+ null,
+ ex);
+ } catch (InvocationTargetException ex) {
+ Logger.getLogger(FileChooserDemo.class.getName()).log(Level.SEVERE,
+ null,
+ ex);
+ }
+ }
+
+
+ private static class InsetPanel extends JPanel {
+
+ Insets i;
+
+ InsetPanel(Insets i) {
+ this.i = i;
+ }
+
+ @Override
+ public Insets getInsets() {
+ return i;
+ }
+ }
+}