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

JComboBox missing scrollbar in multi-monitor setup on smaller monitor

XMLWordPrintable

    • x86_64
    • linux_ubuntu

      ADDITIONAL SYSTEM INFORMATION :
      KUbuntu 18.04LTS
      2 monitors - one with a higher (larger) resolution than the other
      Problem was reproduced with two different monitors configurations:
      Larger Monitor = 2K resolution and Small Monitor = 1080p
      Larger Monitor = 4K resolution and Small Monitor = 1080p

      A DESCRIPTION OF THE PROBLEM :
      A JComboBox is rendered on an application that starts on the smaller monitor of a two monitor set up. The JComboBox has enough items that it will need a scrollbar on the smaller monitor, but not the larger. However, the scrollbar will not appear and some items in the JComboBox drop down will be inaccessible.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Run the application provided (a modified version of Java Tutorials Code Sample – ComboBoxDemo.java) on a system with two monitors of different sizes. Have the application start on the smaller monitor (this may not be necessary, but is the situation where we saw the defect) and click on the ComboBox. The scrollbar will be missing on the Combo Box pop up.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Scrollbar should be present on the ComboBox pop up.
      ACTUAL -
      The scrollbar will be missing on the Combo Box pop up.

      ---------- BEGIN SOURCE ----------
      /*
       * Code largely lifted and modified from Java Tutorials Code Sample – ComboBoxDemo.java
       */
      package brokenscrollbar;

      import java.awt.BorderLayout;
      import java.awt.Dimension;
      import java.awt.Font;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import javax.swing.BorderFactory;
      import javax.swing.ImageIcon;
      import javax.swing.JComboBox;
      import javax.swing.JComponent;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JPanel;

      /**
       *
       * @author smm
       */
      public class BrokenScrollBar extends JPanel implements ActionListener {
          JLabel picture;
       
          public BrokenScrollBar() {
              super(new BorderLayout());
       
              String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig",
              "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig", "Bird", "Cat", "Dog", "Rabbit", "Pig"};
       
              //Create the combo box, select the item at index 4.
              //Indices start at 0, so 4 specifies the pig.
              JComboBox petList = new JComboBox(petStrings);
              petList.setSelectedIndex(4);
              petList.addActionListener(this);
              petList.setMaximumRowCount(Integer.MAX_VALUE);
       
              //Set up the picture.
              picture = new JLabel();
              picture.setFont(picture.getFont().deriveFont(Font.ITALIC));
              picture.setHorizontalAlignment(JLabel.CENTER);
              updateLabel(petStrings[petList.getSelectedIndex()]);
              picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
       
              //The preferred size is hard-coded to be the width of the
              //widest image and the height of the tallest image + the border.
              //A real program would compute this.
              picture.setPreferredSize(new Dimension(177, 122+10));
       
              //Lay out the demo.
              add(petList, BorderLayout.PAGE_START);
              add(picture, BorderLayout.PAGE_END);
              setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
          }
       
          /** Listens to the combo box. */
          public void actionPerformed(ActionEvent e) {
              JComboBox cb = (JComboBox)e.getSource();
              String petName = (String)cb.getSelectedItem();
              updateLabel(petName);
          }
       
          protected void updateLabel(String name) {
              ImageIcon icon = createImageIcon("images/" + name + ".gif");
              picture.setIcon(icon);
              picture.setToolTipText("A drawing of a " + name.toLowerCase());
              if (icon != null) {
                  picture.setText(null);
              } else {
                  picture.setText("Image not found");
              }
          }
       
          /** Returns an ImageIcon, or null if the path was invalid. */
          protected static ImageIcon createImageIcon(String path) {
              java.net.URL imgURL = BrokenScrollBar.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() {
              //Create and set up the window.
              JFrame frame = new JFrame("ComboBoxDemo");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
              //Create and set up the content pane.
              JComponent newContentPane = new BrokenScrollBar();
              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();
                  }
              });
          }
          
      }

      ---------- END SOURCE ----------

      FREQUENCY : always


            bvaidya Balchandra Vaidya
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: