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

Missing Separators for JMenuBar under GTK

XMLWordPrintable

      FULL PRODUCT VERSION :
      owner@owner-VirtualBox:~/Desktop$ java -version
      openjdk version "1.8.0_66-internal"
      OpenJDK Runtime Environment (build 1.8.0_66-internal-b17)
      OpenJDK 64-Bit Server VM (build 25.66-b17, mixed mode)


      ADDITIONAL OS VERSION INFORMATION :
      owner@owner-VirtualBox:~/Desktop$ uname -a
      Linux owner-VirtualBox 4.2.0-16-generic #19-Ubuntu SMP Thu Oct 8 15:35:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux


      A DESCRIPTION OF THE PROBLEM :
      Separators for JMenu/JMenuBar are completely invisible and do not affect the spacing of JMenuItems at all under the GTK look and feel.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Create a menu bar and populate it with some default items and separators.
      2. Set the system/GTK look and feel.
      3. Observe the missing separators.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      It is expected that the native looking GTK separators would appear and add some visually aesthetic spacing to menus.
      ACTUAL -
      GTK separators are completely invisible and do not affect the spacing of menus.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      /// SSCCE modified from the Oracle MenuBar example to reproduce OpenJDK issue

      package test;

      import java.awt.event.*;
      import javax.swing.JMenu;
      import javax.swing.JMenuItem;
      import javax.swing.JCheckBoxMenuItem;
      import javax.swing.JRadioButtonMenuItem;
      import javax.swing.ButtonGroup;
      import javax.swing.JMenuBar;
      import javax.swing.KeyStroke;
      import javax.swing.UIManager;
      import javax.swing.UnsupportedLookAndFeelException;
      import javax.swing.ImageIcon;

      import javax.swing.JFrame;

      /* MenuDemo.java requires images/middle.gif. */

      /*
       * This class is just like MenuLookDemo, except the menu items
       * actually do something, thanks to event listeners.
       */
      public class GTKMenuBarBug {

          public JMenuBar createMenuBar() {
              JMenuBar menuBar;
              JMenu menu, submenu;
              JMenuItem menuItem;
              JRadioButtonMenuItem rbMenuItem;
              JCheckBoxMenuItem cbMenuItem;

              //Create the menu bar.
              menuBar = new JMenuBar();

              //Build the first menu.
              menu = new JMenu("A Menu");
              menu.setMnemonic(KeyEvent.VK_A);
              menu.getAccessibleContext().setAccessibleDescription(
                      "The only menu in this program that has menu items");
              menuBar.add(menu);

              //a group of JMenuItems
              menuItem = new JMenuItem("A text-only menu item",
                                       KeyEvent.VK_T);
              //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
              menuItem.setAccelerator(KeyStroke.getKeyStroke(
                      KeyEvent.VK_1, ActionEvent.ALT_MASK));
              menuItem.getAccessibleContext().setAccessibleDescription(
                      "This doesn't really do anything");
              menu.add(menuItem);

              //a group of radio button menu items
              menu.addSeparator();
              ButtonGroup group = new ButtonGroup();

              rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
              rbMenuItem.setSelected(true);
              rbMenuItem.setMnemonic(KeyEvent.VK_R);
              group.add(rbMenuItem);
              menu.add(rbMenuItem);

              rbMenuItem = new JRadioButtonMenuItem("Another one");
              rbMenuItem.setMnemonic(KeyEvent.VK_O);
              group.add(rbMenuItem);
              menu.add(rbMenuItem);

              //a group of check box menu items
              menu.addSeparator();
              cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
              cbMenuItem.setMnemonic(KeyEvent.VK_C);
              menu.add(cbMenuItem);

              cbMenuItem = new JCheckBoxMenuItem("Another one");
              cbMenuItem.setMnemonic(KeyEvent.VK_H);
              menu.add(cbMenuItem);

              //a submenu
              menu.addSeparator();
              submenu = new JMenu("A submenu");
              submenu.setMnemonic(KeyEvent.VK_S);

              menuItem = new JMenuItem("An item in the submenu");
              menuItem.setAccelerator(KeyStroke.getKeyStroke(
                      KeyEvent.VK_2, ActionEvent.ALT_MASK));
              submenu.add(menuItem);

              menuItem = new JMenuItem("Another item");
              submenu.add(menuItem);
              menu.add(submenu);

              //Build second menu in the menu bar.
              menu = new JMenu("Another Menu");
              menu.setMnemonic(KeyEvent.VK_N);
              menu.getAccessibleContext().setAccessibleDescription(
                      "This menu does nothing");
              menuBar.add(menu);

              return menuBar;
          }

          // Returns just the class name -- no package info.
          protected String getClassName(Object o) {
              String classString = o.getClass().getName();
              int dotIndex = classString.lastIndexOf(".");
              return classString.substring(dotIndex+1);
          }

          /** Returns an ImageIcon, or null if the path was invalid. */
          protected static ImageIcon createImageIcon(String path) {
              java.net.URL imgURL = GTKMenuBarBug.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("MenuDemo");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

              //Create and set up the content pane.
              GTKMenuBarBug demo = new GTKMenuBarBug();
              frame.setJMenuBar(demo.createMenuBar());

              //Display the window.
              frame.setSize(450, 260);
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
          }

          public static void main(String[] args) {
              // Set the GTK Look and Feel
              try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
              } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              } catch (UnsupportedLookAndFeelException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }

              //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 ----------

      SUPPORT :
      YES

            ssadetsky Semyon Sadetsky (Inactive)
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: