United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
JDK-5036904 : JFileChooser in Motif L&F does not comply with Section 508

Details
Type:
Bug
Submit Date:
2004-04-23
Status:
Resolved
Updated Date:
2004-10-13
Project Name:
JDK
Resolved Date:
2004-09-20
Component:
client-libs
OS:
solaris_9,solaris_8
Sub-Component:
javax.swing
CPU:
sparc
Priority:
P2
Resolution:
Fixed
Affected Versions:
1.4.2_04,1.4.2_05
Fixed Versions:
1.4.2_07 (b01)

Related Reports
Backport:
Backport:
Relates:
Relates:
Relates:

Sub Tasks

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
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
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
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



Hardware and Software, Engineered to Work Together