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

[macosx] Editable JComboBox misaligned on macOS 10.12 Sierra

    XMLWordPrintable

    Details

      Description

      FULL PRODUCT VERSION :
      java version "1.8.0_131"
      Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
      Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      ProductName: Mac OS X
      ProductVersion: 10.12.4
      BuildVersion: 16E195

      A DESCRIPTION OF THE PROBLEM :
      On macOS 10.12 the top and bottom edges of the JComboBox dropdown button are slightly higher than the top and bottom edges of the editable text field. On Mac OS X 10.11 the edges are more properly aligned.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      On macOS 10.12

      javac ComboBoxDemo2.java
      java ComboBoxDemo2

      Observe alignment of dropdown button with editable text field, compare to Mac OS X 10.11

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      On Mac OS X 10.11 the top and bottom edges of the JComboBox dropdown button are more properly aligned with the top and bottom edges of the editable text field.
      ACTUAL -
      On macOS 10.12 the top and bottom edges of the JComboBox dropdown button are slightly higher than the top and bottom edges of the editable text field.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      /*
       * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
       *
       * Redistribution and use in source and binary forms, with or without
       * modification, are permitted provided that the following conditions
       * are met:
       *
       * - Redistributions of source code must retain the above copyright
       * notice, this list of conditions and the following disclaimer.
       *
       * - Redistributions in binary form must reproduce the above copyright
       * notice, this list of conditions and the following disclaimer in the
       * documentation and/or other materials provided with the distribution.
       *
       * - Neither the name of Oracle or the names of its
       * contributors may be used to endorse or promote products derived
       * from this software without specific prior written permission.
       *
       * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       */

      // package components;

      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.*;
      import javax.swing.border.*;
      import java.util.*;
      import java.text.SimpleDateFormat;

      /* ComboBoxDemo2.java requires no other files. */
      public class ComboBoxDemo2 extends JPanel
                                 implements ActionListener {
          static JFrame frame;
          JLabel result;
          String currentPattern;

          public ComboBoxDemo2() {
              setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
              String[] patternExamples = {
                       "dd MMMMM yyyy",
                       "dd.MM.yy",
                       "MM/dd/yy",
                       "yyyy.MM.dd G 'at' hh:mm:ss z",
                       "EEE, MMM d, ''yy",
                       "h:mm a",
                       "H:mm:ss:SSS",
                       "K:mm a,z",
                       "yyyy.MMMMM.dd GGG hh:mm aaa"
                       };

              currentPattern = patternExamples[0];

              //Set up the UI for selecting a pattern.
              JLabel patternLabel1 = new JLabel("Enter the pattern string or");
              JLabel patternLabel2 = new JLabel("select one from the list:");

              JComboBox patternList = new JComboBox(patternExamples);
              patternList.setEditable(true);
              patternList.addActionListener(this);

              //Create the UI for displaying result.
              JLabel resultLabel = new JLabel("Current Date/Time",
                                              JLabel.LEADING); //== LEFT
              result = new JLabel(" ");
              result.setForeground(Color.black);
              result.setBorder(BorderFactory.createCompoundBorder(
                   BorderFactory.createLineBorder(Color.black),
                   BorderFactory.createEmptyBorder(5,5,5,5)
              ));

              //Lay out everything.
              JPanel patternPanel = new JPanel();
              patternPanel.setLayout(new BoxLayout(patternPanel,
                                     BoxLayout.PAGE_AXIS));
              patternPanel.add(patternLabel1);
              patternPanel.add(patternLabel2);
              patternList.setAlignmentX(Component.LEFT_ALIGNMENT);
              patternPanel.add(patternList);

              JPanel resultPanel = new JPanel(new GridLayout(0, 1));
              resultPanel.add(resultLabel);
              resultPanel.add(result);

              patternPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
              resultPanel.setAlignmentX(Component.LEFT_ALIGNMENT);

              add(patternPanel);
              add(Box.createRigidArea(new Dimension(0, 10)));
              add(resultPanel);

              setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

              reformat();
          } //constructor

          public void actionPerformed(ActionEvent e) {
              JComboBox cb = (JComboBox)e.getSource();
              String newSelection = (String)cb.getSelectedItem();
              currentPattern = newSelection;
              reformat();
          }

          /** Formats and displays today's date. */
          public void reformat() {
              Date today = new Date();
              SimpleDateFormat formatter =
                 new SimpleDateFormat(currentPattern);
              try {
                  String dateString = formatter.format(today);
                  result.setForeground(Color.black);
                  result.setText(dateString);
              } catch (IllegalArgumentException iae) {
                  result.setForeground(Color.red);
                  result.setText("Error: " + iae.getMessage());
              }
          }

          /**
           * 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("ComboBoxDemo2");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

              //Create and set up the content pane.
              JComponent newContentPane = new ComboBoxDemo2();
              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 ----------

        Attachments

          Activity

            People

            Assignee:
            Unassigned Unassigned
            Reporter:
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Dates

              Created:
              Updated: