JDK-6173664 : ALT + I does not work with Motif L & F
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 1.4.2_05
  • Priority: P2
  • Status: Resolved
  • Resolution: Fixed
  • OS: solaris_8
  • CPU: sparc
  • Submitted: 2004-10-04
  • Updated: 2010-04-02
  • Resolved: 2004-10-16
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 Availability Release.

To download the current JDK release, click here.
Other JDK 6
1.4.2_08Fixed 6 b09Fixed
Description
The test case below shows that the ALT + I accelerator key functionality is broken with the
Motif L&F with both 1.4.2_05 and 1.5.0-b64
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());
          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( "javax.swing.plaf.metal.MetalLookAndFeel" );
            UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel" );
            System.out.println("Look and feel is : "+UIManager.getLookAndFeel());
        } 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();
              }
          });
      }
      }
###@###.### 10/4/04 12:47 GMT

Comments
EVALUATION ALT + I works perfectly fine. The problem is that it puts focus on the file list which doesn't initially show focus. This has already been fixed in a 1.4.2 update and 1.5.0 update release. Closing as a duplicate of 5036904. ###@###.### 10/4/04 15:41 GMT Okay, ALT + I has problems in 1.4.2. Re-opening. The problem is that the label is set as the label for the scrollpane rather than the list. As a result, focus is requested on the wrong component. The fix is to call setLabelFor() with the list as the param rather than the scrollpane. ###@###.### 10/7/04 15:51 GMT Note that fix is appropriate for 1.5 and up too, so it can/should be applied to any release after 1.4.2 as well. ###@###.### 10/7/04 16:33 GMT
04-10-2004