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

JCombobox's popup menu gets clipped first time it's mapped

XMLWordPrintable

    • beta
    • x86
    • windows_nt



      Name: dbT83986 Date: 01/10/99


      The very first time the popup menu for a JCombobox is mapped,
      regardless of the Look&Feel, the bottom one or two pixels are
      missing. After the first time the menu is drawn correctly.

      The following code will demonstrate the problem:

      //~~~~~~~~~~~~~~~~~~~~~~~~ cut here ~~~~~~~~~~~~~~~~~~~~~~~~~~
      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.*;

      public class comboboxBug extends JPanel {
          static JFrame frame;

          static String metal= "Metal";
          static String metalClassName = "javax.swing.plaf.metal.MetalLookAndFeel";

          static String motif = "Motif";
          static String motifClassName =
                  "com.sun.java.swing.plaf.motif.MotifLookAndFeel";

          static String windows = "Windows";
          static String windowsClassName =
                  "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

          JRadioButton metalButton, motifButton, windowsButton;

          public comboboxBug() {

              String fruitChoices[] = {"Apple", "Banana", "Cherry", "Fig", "Grape", "Watermelon"};
              JComboBox fruits = new JComboBox(fruitChoices);
              fruits.setMaximumRowCount(4);

              metalButton = new JRadioButton(metal);
              metalButton.setActionCommand(metalClassName);

              motifButton = new JRadioButton(motif);
              motifButton.setActionCommand(motifClassName);

              windowsButton = new JRadioButton(windows);
              windowsButton.setActionCommand(windowsClassName);

              // Group the radio buttons.
              ButtonGroup group = new ButtonGroup();
              group.add(metalButton);
              group.add(motifButton);
              group.add(windowsButton);

              // Register a listener for the radio buttons.
              RadioListener myListener = new RadioListener();
              metalButton.addActionListener(myListener);
              motifButton.addActionListener(myListener);
              windowsButton.addActionListener(myListener);

              add(fruits);
              add(metalButton);
              add(motifButton);
              add(windowsButton);
          }


          /** An ActionListener that listens to the radio buttons. */
          class RadioListener implements ActionListener {
              public void actionPerformed(ActionEvent e) {
                  String lnfName = e.getActionCommand();

                  try {
                      UIManager.setLookAndFeel(lnfName);
                      SwingUtilities.updateComponentTreeUI(frame);
                      frame.pack();
                  }
                  catch (Exception exc) {
                      JRadioButton button = (JRadioButton)e.getSource();
                      button.setEnabled(false);
                      updateState();
                      System.err.println("Could not load LookAndFeel: " + lnfName);
                  }
                  
              }
          }

          public void updateState() {
               String lnfName = UIManager.getLookAndFeel().getClass().getName();
               if (lnfName.indexOf(metal) >= 0) {
                   metalButton.setSelected(true);
               } else if (lnfName.indexOf(windows) >= 0) {
                   windowsButton.setSelected(true);
               } else if (lnfName.indexOf(motif) >= 0) {
                   motifButton.setSelected(true);
               } else {
                   System.err.println("SimpleExample is using an unknown L&F: " + lnfName);
               }
          }

          public static void main(String s[]) {

              comboboxBug panel = new comboboxBug();
              
              frame = new JFrame("Combobox Menu Bug");
              frame.addWindowListener(new WindowAdapter() {
                  public void windowClosing(WindowEvent e) {System.exit(0);}
              });
              frame.getContentPane().add(panel);
              frame.pack();
              frame.setVisible(true);
              
              panel.updateState();
          }
      }
      (Review ID: 52358)
      ======================================================================

            mdavidsosunw Mark Davidson (Inactive)
            dblairsunw Dave Blair (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: