JDK-5036904 : JFileChooser in Motif L&F does not comply with Section 508
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 1.4.2_04,1.4.2_05
  • Priority: P2
  • Status: Resolved
  • Resolution: Fixed
  • OS: solaris_8,solaris_9
  • CPU: sparc
  • Submitted: 2004-04-23
  • Updated: 2004-10-13
  • Resolved: 2004-09-20
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availabitlity Release.

To download the current JDK release, click here.
Other JDK 6
1.4.2_07 b01Fixed 6Fixed
Related Reports
Relates :  
Relates :  
Relates :  
Description
The test case below shows that the following functionality is broken with the Motif L&F on Solaris with both 1.4.2_04 and 1.5.0-beta (note that the Metal L&F does not exhibit these problems):

-  Cannot descend into a selected directory or open a selected file by pressing Return
-  Some keyboard accelerators like ALT+I don't work.
-  Will only select entries if there is more than one file.
-  Focus is not shown when you first tab into the Folders or Files lists


FileChooserDemo.java:


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

/*
 * FileChooserDemo.java is a 1.4 application that 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();

        //Uncomment one of the following lines to try a different
        //file selection mode.  The first allows just directories
        //to be selected (and, at least in the Java look and feel,
        //shown).  The second allows both files and directories
        //to be selected.  If you leave these lines commented out,
        //then the default mode (FILES_ONLY) will be used.
        //
        //fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        //fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

        //Create the open button.  We use the image from the JLF
        //Graphics Repository (but we extracted it from the jar).
        openButton = new JButton("Open a File");
        openButton.addActionListener(this);
        openButton.setMnemonic(KeyEvent.VK_O);

        //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...");
        saveButton.addActionListener(this);
     saveButton.setMnemonic(KeyEvent.VK_S);

        //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-dispatching thread.
     */
    private static void createAndShowGUI() {

      String      className;

      // install default LAF for platform
      try {
          className = System.getProperty( "swing.defaultlaf" );
          if( className == null ) {
            className = UIManager.getSystemLookAndFeelClassName();
          }
          UIManager.setLookAndFeel( className );
      } catch( Exception e ) {}

        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);

        //Create and set up the window.
        JFrame frame = new JFrame("FileChooserDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new FileChooserDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
###@###.### 2004-04-23

Comments
CONVERTED DATA BugTraq+ Release Management Values COMMIT TO FIX: 1.4.2_07 1.5.0_01 mustang FIXED IN: 1.4.2_07 1.5.0_01 mustang INTEGRATED IN: 1.4.2_07 1.5.0_01 mustang
2004-10-02

PUBLIC COMMENTS Motif apps in general are not accessible via AT, so keynav in a Motif L&F provides only little leverage for people with disabilities and does not meet all the requirements of Section 508. Recommend using Metal L&F instead.
2004-10-02

EVALUATION Since there is a work around as noted by the submitter (use Metal L&F), the Motif L&F will not be fixed. Motif apps in general are not accessible via AT, so keynav in a Motif L&F provides only little leverage for people with disabilities and doesn't not meet all the requirements of Section 508. ###@###.### 2004-04-27 Name: sh120115 Date: 05/03/2004 The submitter mentions four accessibility problems. I will address each individually: - Cannot descend into a selected directory or open a selected file by pressing Return Agreed. Users should be able to select a file or traverse directories using the keyboard. - Some keyboard accelerators like ALT+I don't work. Not reproducible. Using ALT-I transferred focus to the file list as expected. All mnemonics worked. Perhaps it just didn't seem so as a result of item 4. - Will only select entries if there is more than one file. This item isn't clear and I wasn't sure what to look for. - Focus is not shown when you first tab into the Folders or Files lists Focus is not shown because nothing is selected. This is the case in ALL look and feels. We can fix this by putting the lead selection index on the first item. This can be done in one of two ways: a) Calling removeSelectionInterval(0, 0) when the file list is first created b) If we KNOW that that the list selection model is a DefaultListSelectionModel, we can call moveLeadSelectionIndex(0) ###@###.### 2004-05-03 ====================================================================== This bug has 3 related issues. The following is reasoning for the 3rd one: Will only select entries if there is more than one file The prime problem in bug 5036904, is when a single file / directory entry is there in JList, it can not be selected using keyboard arrow keys. This is because of the lead selection index implementation in list selection model. At present, the lead selection index is not getting reset to it's initial position(-1) when the list is of dynamic nature with respect to its content (list items). That means, in case of a dynamic list where the list items vary from 0,1....n., the lead selection index is not resetting to it's initial value. For example, when a list has 20 items, and user selected 18th item, and then the list got dynamic to get a fresh list of only 4 items, then lead selection index still sits at old value. in this case 18th index. Hence we have this problem. ###@###.### 2004-07-23 BasicListUI needs to be changed to deal specially with selection in single item lists. ###@###.### 2004-08-17
2004-07-23