Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8144760

[macosx] Un-selectable first item in JFileChooser FileFilter combobox

XMLWordPrintable

      FULL PRODUCT VERSION :
      java version "1.8.0_60"
      Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
      Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Mac OSX 10.10
      Mac OSX 10.11

      Possibly other versions of OSX

      A DESCRIPTION OF THE PROBLEM :
      if the FileFilter is programatically set, via setFileFilter(), the user can no longer select the first item in the dropdown, regardless of what it is. They must first select any other option, then the first item becomes selectable.

      REGRESSION. Last worked in version 8u45

      ADDITIONAL REGRESSION INFORMATION:
      java version "1.8.0_31"
      Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
      Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

      Bug occurs in every release since update 31

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Create a JFileChooser

      Add 2 or more FileFilters to it

      Call setFileFilter on the JFileChooser and set the FileFilter to one of the ones you added

      Run the program, show the JFileChooser and try to select the first item in the file filter combo box

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The combo box changes to the first item
      ACTUAL -
      The combo box stays on the filter set by setFileFilter()

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      //FileChooser demo from Oracle documentation

      package components;

      import java.io.*;
      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.*;
      import javax.swing.SwingUtilities;
      import javax.swing.filechooser.FileFilter;

      /*
       * FileChooserDemo.java uses these files:
       * images/Open16.gif
       * images/Save16.gif
       */
      public class FileChooserDemo extends JPanel
                                   implements ActionListener {
          static private final String newline = "\n";
          JButton openButton, saveButton;
          JTextArea log;
          JFileChooser fc;

          public FileChooserDemo() {
              super(new BorderLayout());

              //Create the log first, because the action listeners
              //need 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);

              //Create a file chooser
              fc = new JFileChooser();
              
              //Create a bunch of file filters to demonstrate bug
              FileFilter ffcsv = new FileFilter()
              {
                  
                  @Override
                  public String getDescription()
                  {
                      return "csv";
                  }
                  
                  @Override
                  public boolean accept(
                      File f)
                  {
                      // TODO Auto-generated method stub
                      return false;
                  }
              };
              
              FileFilter ffxls = new FileFilter()
              {
                  
                  @Override
                  public String getDescription()
                  {
                      return "xls";
                  }
                  
                  @Override
                  public boolean accept(
                      File f)
                  {
                      // TODO Auto-generated method stub
                      return false;
                  }
              };
              
              FileFilter ffxlsx = new FileFilter()
              {
                  
                  @Override
                  public String getDescription()
                  {
                      return "xlsx";
                  }
                  
                  @Override
                  public boolean accept(
                      File f)
                  {
                      // TODO Auto-generated method stub
                      return false;
                  }
              };

              
              System.out.println("Java version: " + System.getProperty("java.version"));
              fc.addChoosableFileFilter(ffcsv);
              fc.addChoosableFileFilter(ffxls);
              fc.addChoosableFileFilter(ffxlsx);
              
              //if the FileFilter is set to anything other than default, the user can no longer select the first item in the dropdown, regardless of what it it
              //they must first change the dropdown to something else, then the first item becomes selectable
              fc.setFileFilter(ffxls);

              
              
              
              openButton = new JButton("Open a File...",
                                       createImageIcon("images/Open16.gif"));
              openButton.addActionListener(this);

              //Create the save button. We use the image from the JLF
              //Graphics Repository (but we extracted it from the jar).
              saveButton = new JButton("Save a File...",
                                       createImageIcon("images/Save16.gif"));
              saveButton.addActionListener(this);

              //For layout purposes, put the buttons in a separate panel
              JPanel buttonPanel = new JPanel(); //use FlowLayout
              buttonPanel.add(openButton);
              buttonPanel.add(saveButton);

              //Add the buttons and the log to this panel.
              add(buttonPanel, BorderLayout.PAGE_START);
              add(logScrollPane, BorderLayout.CENTER);
          }

          public void actionPerformed(ActionEvent e) {

              //Handle open button action.
              if (e.getSource() == openButton) {
                  int returnVal = fc.showOpenDialog(FileChooserDemo.this);

                  if (returnVal == JFileChooser.APPROVE_OPTION) {
                      File file = fc.getSelectedFile();
                      //This is where a real application would open the file.
                      log.append("Opening: " + file.getName() + "." + newline);
                  } else {
                      log.append("Open command cancelled by user." + newline);
                  }
                  log.setCaretPosition(log.getDocument().getLength());

              //Handle save button action.
              } else if (e.getSource() == saveButton) {
                  int returnVal = fc.showSaveDialog(FileChooserDemo.this);
                  if (returnVal == JFileChooser.APPROVE_OPTION) {
                      File file = fc.getSelectedFile();
                      //This is where a real application would save the file.
                      log.append("Saving: " + file.getName() + "." + newline);
                  } else {
                      log.append("Save command cancelled by user." + newline);
                  }
                  log.setCaretPosition(log.getDocument().getLength());
              }
          }

          /** Returns an ImageIcon, or null if the path was invalid. */
          protected static ImageIcon createImageIcon(String path) {
              java.net.URL imgURL = FileChooserDemo.class.getResource(path);
              if (imgURL != null) {
                  return new ImageIcon(imgURL);
              } else {
                  System.err.println("Couldn't find file: " + path);
                  return 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("FileChooserDemo");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

              //Add content to the window.
              frame.add(new FileChooserDemo());

              //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();
                  }
              });
          }
      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Select any other item other than the first item, then every option is selectable

            aniyogi Avik Niyogi (Inactive)
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: