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

JFileChooser in Motif L&F does not comply with Section 508

    Details

    • Subcomponent:
    • Resolved In Build:
      b01
    • CPU:
      sparc
    • OS:
      solaris_8, solaris_9

      Backports

        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

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  hgodugusunw Harsha Godugu (Inactive)
                  Reporter:
                  klevesqusunw Kim Levesque (Inactive)
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  2 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved:
                    Imported:
                    Indexed: