Java Solaris Communities Sun Store Join SDN My Profile Why Join?
 
Bug Database
Bug Detail
Quick Lists
Top 25 Bugs
Top 25 RFE's
Recently Closed Bugs
Printable Page Printable Page


Bug Database
Bug ID: 4235456
Votes 0
Synopsis Only the first menu item having a duplicate mnemonic is ever found via the mnemo
Category java:classes_swing
Reported Against 1.2fcs
Release Fixed
State 11-Closed, Will Not Fix, bug
Priority: 4-Low
Related Bugs 4249799
Submit Date 05-MAY-1999
Description




/* FILE: /SwingMenuTests/IntlMenu.java (bts19328)

  When two menu items have the same mnemonic, pressing that character 
activates the first item.  It would be better to move to the item on the menu 
but not activate it, typing the char again moves to the next item having the
same mnemonic, until the desired item receives focus.  Pressing <Enter> then 
activates that menu item. 

Steps to Reproduce:
0. Place IntlMenuApp.java & IntlMenuFrame.java in the dir, \SwingMenuTests\, off of classpath, compile and run
1.  <Alt-R>    //opens menu "RadioButton items"
2. "p"
//exp: focus to move to the next submenu item which has a 'p' accelerator -- _without_ activating the current 'p' menu item.  Thus it is possible to cycle through all the 'p' menu items.  When you land on the one you want, hitting <Enter>  should activate/select that menu item.
//act:  pressing 'p' always selects the first, and only the first menu item w/ the 'p' accelerator/mnemonic.
*/
package SwingMenuTests;

import javax.swing.UIManager;

public class IntlMenuApp {
  boolean packFrame = false;

  //Construct the application
  public IntlMenuApp() {
    IntlMenuFrame frame = new IntlMenuFrame();
    //Validate frames that have preset sizes
    //Pack frames that have useful preferred size info, e.g. from their layout
    if (packFrame)
      frame.pack();
    else
      frame.validate();
    frame.setVisible(true);
  }

  //Main method
  public static void main(String[] args) {
    try  {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch(Exception e) {
    }
    new IntlMenuApp();
  }
} 

=============================================
// FILE: /SwingMenuTests/IntlMenuFrame.java
package SwingMenuTests;

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

public class IntlMenuFrame extends JFrame {
  BorderLayout borderLayout1 = new BorderLayout();
  JMenuBar intlMenuBar1 = new JMenuBar();
  JMenu stdMenu = new JMenu();
  JMenuItem intlMenuItem1 = new JMenuItem();
  JMenuItem intlMenuItem2 = new JMenuItem();
  JMenuItem intlMenuItem3 = new JMenuItem();
  JMenu rbMenu = new JMenu();
  JRadioButtonMenuItem intlRadioButtonMenuItem1 = new JRadioButtonMenuItem();
  JRadioButtonMenuItem intlRadioButtonMenuItem2 = new JRadioButtonMenuItem();
  JRadioButtonMenuItem intlRadioButtonMenuItem3 = new JRadioButtonMenuItem();
  JMenu cbMenu = new JMenu();
  JCheckBoxMenuItem intlCheckBoxMenuItem1 = new JCheckBoxMenuItem();
  JCheckBoxMenuItem intlCheckBoxMenuItem2 = new JCheckBoxMenuItem();
  JCheckBoxMenuItem intlCheckBoxMenuItem3 = new JCheckBoxMenuItem();
  JRadioButtonMenuItem intlRadioButtonMenuItem4 = new JRadioButtonMenuItem();
  JRadioButtonMenuItem intlRadioButtonMenuItem5 = new JRadioButtonMenuItem();
  JRadioButtonMenuItem intlRadioButtonMenuItem6 = new JRadioButtonMenuItem();
  JMenu fileMenu = new JMenu();
  JMenuItem intlMenuItem4 = new JMenuItem();
  ButtonGroup intlMenuGroup1 = new ButtonGroup();
  ButtonGroup intlMenuGroup2 = new ButtonGroup();
  JLabel jdbStatusLabel1 = new JLabel();           
  JPanel jPanel1 = new JPanel();
  JLabel jLabel1 = new JLabel();
  JPopupMenu jPopupMenu1 = new JPopupMenu();
  JMenu popupChecks = new JMenu();
  JCheckBoxMenuItem popupCheckBoxMenuItem1 = new JCheckBoxMenuItem();
  JCheckBoxMenuItem popupCheckBoxMenuItem2 = new JCheckBoxMenuItem();
  JCheckBoxMenuItem popupCheckBoxMenuItem3 = new JCheckBoxMenuItem();
  JMenu popupButtons = new JMenu();
  JRadioButtonMenuItem popupRadioButtonMenuItem1 = new JRadioButtonMenuItem();
  JRadioButtonMenuItem popupRadioButtonMenuItem2 = new JRadioButtonMenuItem();
  GridBagLayout gridBagLayout1 = new GridBagLayout();
  ButtonGroup popupGroup = new ButtonGroup();
//Construct the frame
  public IntlMenuFrame() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try  {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  //Component initialization
  private void jbInit() throws Exception  {
    this.getContentPane().setLayout(borderLayout1);
    this.getContentPane().setBackground(new Color(121, 227, 242));
    this.setSize(new Dimension(500, 250));
    this.setTitle("Frame Title");
    stdMenu.setText("Standard menu items");
    stdMenu.setMnemonic('m');
    intlMenuItem1.setText("Derc");
    intlMenuItem1.setMnemonic('D');
    intlMenuItem1.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        intlMenuItem1_actionPerformed(e);
      }
    });
    intlMenuItem2.setText("Rick");
    intlMenuItem2.setMnemonic('R');
    intlMenuItem2.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        intlMenuItem2_actionPerformed(e);
      }
    });
    intlMenuItem3.setText("Wendy");
    intlMenuItem3.setMnemonic('W');
    intlMenuItem3.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        intlMenuItem3_actionPerformed(e);
      }
    });
    rbMenu.setText("RadioButton items");
    rbMenu.setMnemonic('R');
    intlRadioButtonMenuItem1.setText("Pop");
    intlRadioButtonMenuItem1.setMnemonic('P');
    intlRadioButtonMenuItem2.setText("Crackle");
    intlRadioButtonMenuItem2.setMnemonic('C');
    intlRadioButtonMenuItem3.setText("Snap");
    intlRadioButtonMenuItem3.setMnemonic('p');
    cbMenu.setText("CheckBox items");
    cbMenu.setMnemonic('C');
    intlCheckBoxMenuItem1.setText("DataStore");
    intlCheckBoxMenuItem1.setMnemonic('S');
    intlCheckBoxMenuItem2.setText("DataExpress");
    intlCheckBoxMenuItem2.setMnemonic('E');
    intlCheckBoxMenuItem3.setText("dbSwing");
    intlCheckBoxMenuItem3.setMnemonic('d');
    intlRadioButtonMenuItem4.setText("Standard");
    intlRadioButtonMenuItem4.setMnemonic('S');
    intlRadioButtonMenuItem5.setText("Pro");
    intlRadioButtonMenuItem5.setMnemonic('P');
    intlRadioButtonMenuItem6.setText("Enterprise");
    intlRadioButtonMenuItem6.setMnemonic('p');
    fileMenu.setText("File");
    fileMenu.setMnemonic('F');
    intlMenuItem4.setText("Exit");
    intlMenuItem4.setMnemonic('x');
    intlMenuItem4.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        intlMenuItem4_actionPerformed(e);
      }
    });

    jdbStatusLabel1.setOpaque(true);
    jPanel1.setOpaque(false);
    jPanel1.setLayout(gridBagLayout1);
    jLabel1.setBackground(Color.white);
    jLabel1.setOpaque(true);
    jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel1.setHorizontalTextPosition(SwingConstants.LEFT);

    jLabel1.setText("Right-click me for a pop-up menu");
    jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {

      public void mouseReleased(MouseEvent e) {
        jLabel1_mouseReleased(e);
      }
    });
    popupChecks.setText("Check boxes");
    popupChecks.setMnemonic('C');
    popupCheckBoxMenuItem3.setText("Check");
    popupCheckBoxMenuItem3.setMnemonic('k');
    popupCheckBoxMenuItem2.setText("Cheque");
    popupCheckBoxMenuItem2.setMnemonic('q');
    popupCheckBoxMenuItem1.setText("Czech");
    popupCheckBoxMenuItem1.setMnemonic('z');
    popupButtons.setText("Radio buttons");
    popupButtons.setMnemonic('R');
    popupRadioButtonMenuItem1.setText("Button");
    popupRadioButtonMenuItem1.setMnemonic('B');
    popupRadioButtonMenuItem2.setText("Buttin\'");
    popupRadioButtonMenuItem2.setMnemonic('B');
    jPopupMenu1.setInvoker(jLabel1);
    intlMenuGroup1.add(intlRadioButtonMenuItem1);
    intlMenuGroup1.add(intlRadioButtonMenuItem2);
    intlMenuGroup1.add(intlRadioButtonMenuItem3);
    intlMenuGroup2.add(intlRadioButtonMenuItem4);
    intlMenuGroup2.add(intlRadioButtonMenuItem5);
    intlMenuGroup2.add(intlRadioButtonMenuItem6);
    popupGroup.add(popupRadioButtonMenuItem1);
    popupGroup.add(popupRadioButtonMenuItem2);

    this.getContentPane().add(intlMenuBar1, BorderLayout.NORTH);
    this.getContentPane().add(jdbStatusLabel1, BorderLayout.SOUTH);
    this.getContentPane().add(jPanel1, BorderLayout.CENTER);
    jPanel1.add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 20, 10));
    intlMenuBar1.add(fileMenu);
    intlMenuBar1.add(stdMenu);
    intlMenuBar1.add(rbMenu);
    intlMenuBar1.add(cbMenu);
    stdMenu.add(intlMenuItem1);
    stdMenu.add(intlMenuItem2);
    stdMenu.add(intlMenuItem3);
    rbMenu.add(intlRadioButtonMenuItem3);
    rbMenu.add(intlRadioButtonMenuItem2);
    rbMenu.add(intlRadioButtonMenuItem1);
    rbMenu.addSeparator();                         
    rbMenu.add(intlRadioButtonMenuItem6);
    rbMenu.add(intlRadioButtonMenuItem5);
    rbMenu.add(intlRadioButtonMenuItem4);
    cbMenu.add(intlCheckBoxMenuItem3);
    cbMenu.add(intlCheckBoxMenuItem2);
    cbMenu.add(intlCheckBoxMenuItem1);
    fileMenu.add(intlMenuItem4);
    jPopupMenu1.add(popupChecks);
    jPopupMenu1.add(popupButtons);
    popupChecks.add(popupCheckBoxMenuItem3);
    popupChecks.add(popupCheckBoxMenuItem2);
    popupChecks.add(popupCheckBoxMenuItem1);
    popupButtons.add(popupRadioButtonMenuItem1);
    popupButtons.add(popupRadioButtonMenuItem2);
}

  //Overriden so we can exit on System Close
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if(e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  void intlMenuItem4_actionPerformed(ActionEvent e) {
    System.exit(0);
  }

  void intlMenuItem1_actionPerformed(ActionEvent e) {
    jdbStatusLabel1.setText("Derc");
  }

  void intlMenuItem2_actionPerformed(ActionEvent e) {
    jdbStatusLabel1.setText("Rick");
  }

  void intlMenuItem3_actionPerformed(ActionEvent e) {
    jdbStatusLabel1.setText("Wendy");
  }

  void jLabel1_mouseReleased(MouseEvent e) {
    if (e.isPopupTrigger()) {
// How to show popup in the right place without using a deprecated method?     
    jPopupMenu1.show(jLabel1, e.getX(), e.getY());
    }
  }
}
(Review ID: 57837)
======================================================================
Work Around




<none known>
======================================================================
Evaluation
This is not a part of the keyboard-navigation design.  What is specified is
that the first menu with the mnemonic will open, and if you want to access
other menus, this can be done with the arrow keys.  It is the responsibility
of the application designer to choose mnemonics such that there are no
conflicts.
 xxxxx@xxxxx  1999-06-01
Comments
  
  Include a link with my name & email   

Submitted On 10-AUG-1999
MiguelM
The evaluation violates conventions in many 
GUIs. Usually, if a mnemonic is used multiple 
times, typing that character will toggle through
the various items until the user hits the enter
key. To say that &quot;this is not a part of the 
keyboard-navigation design&quot; doesn't address the
issue. This should at least be open as an RFE so
the development community can vote for it.


Submitted On 29-NOV-2001
MiguelM
This is now covered by RFE 4515762.



PLEASE NOTE: JDK6 is formerly known as Project Mustang