Java Tutorial/Swing/JMenuBar

Материал из Java эксперт
Перейти к: навигация, поиск

Adding Menus to and Removing Menus From Menu Bars

If you do add or remove menus, you must then revalidate() the menu bar to display the changes.



   <source lang="java">

import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; public class AddingRemovingJMenu {

 public static void main(final String args[]) {
   JFrame frame = new JFrame("MenuSample Example");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JMenuBar menuBar = new JMenuBar();
   // File Menu, F - Mnemonic
   JMenu fileMenu = new JMenu("File");
   fileMenu.setMnemonic(KeyEvent.VK_F);
   menuBar.add(fileMenu);
   JMenu editMenu = new JMenu("Edit");
   menuBar.add(editMenu);
   
   menuBar.remove(0);
   
   menuBar.revalidate();
   
   frame.setJMenuBar(menuBar);
   frame.setSize(350, 250);
   frame.setVisible(true);
 }

}</source>





Creating JMenuBar Components

   <source lang="java">

import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; public class MenuCreation {

 public static void main(final String args[]) {
   JFrame frame = new JFrame("MenuSample Example");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JMenuBar menuBar = new JMenuBar();
   // File Menu, F - Mnemonic
   JMenu fileMenu = new JMenu("File");
   fileMenu.setMnemonic(KeyEvent.VK_F);
   menuBar.add(fileMenu);
   // File->New, N - Mnemonic
   JMenuItem newMenuItem = new JMenuItem("New", KeyEvent.VK_N);
   fileMenu.add(newMenuItem);
   frame.setJMenuBar(menuBar);
   frame.setSize(350, 250);
   frame.setVisible(true);
 }

}</source>





Customize menu layout by changing the menu bar to use a top-to-bottom box layout, and the popup menu to use a left-to-right box layout

   <source lang="java">

/*

*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JPopupMenu; /**

* @author ges
* @author kwalrath
*/

/* MenuLayoutDemo.java requires no other files. */ public class MenuLayoutDemo {

 public JMenuBar createMenuBar() {
   JMenuBar menuBar = new JMenuBar();
   menuBar.setLayout(new BoxLayout(menuBar, BoxLayout.PAGE_AXIS));
   menuBar.add(createMenu("Menu 1"));
   menuBar.add(createMenu("Menu 2"));
   menuBar.add(createMenu("Menu 3"));
   menuBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));
   return menuBar;
 }
 // used by createMenuBar
 public JMenu createMenu(String title) {
   JMenu m = new HorizontalMenu(title);
   m.add("Menu item #1 in " + title);
   m.add("Menu item #2 in " + title);
   m.add("Menu item #3 in " + title);
   JMenu submenu = new HorizontalMenu("Submenu");
   submenu.add("Submenu item #1");
   submenu.add("Submenu item #2");
   m.add(submenu);
   return m;
 }
 /**
  * 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("MenuLayoutDemo");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   // Create and set up the content pane.
   MenuLayoutDemo demo = new MenuLayoutDemo();
   Container contentPane = frame.getContentPane();
   contentPane.setBackground(Color.WHITE); // contrasting bg
   contentPane.add(demo.createMenuBar(), BorderLayout.LINE_START);
   // Display the window.
   frame.setSize(300, 150);
   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();
     }
   });
 }
 class HorizontalMenu extends JMenu {
   HorizontalMenu(String label) {
     super(label);
     JPopupMenu pm = getPopupMenu();
     pm.setLayout(new BoxLayout(pm, BoxLayout.LINE_AXIS));
   }
   public Dimension getMinimumSize() {
     return getPreferredSize();
   }
   public Dimension getMaximumSize() {
     return getPreferredSize();
   }
   public void setPopupMenuVisible(boolean b) {
     boolean isVisible = isPopupMenuVisible();
     if (b != isVisible) {
       if ((b == true) && isShowing()) {
         // Set location of popupMenu (pulldown or pullright).
         // Perhaps this should be dictated by L&F.
         int x = 0;
         int y = 0;
         Container parent = getParent();
         if (parent instanceof JPopupMenu) {
           x = 0;
           y = getHeight();
         } else {
           x = getWidth();
           y = 0;
         }
         getPopupMenu().show(this, x, y);
       } else {
         getPopupMenu().setVisible(false);
       }
     }
   }
 }

}</source>





Customizing JMenuBar Look and Feel

Property StringObject TypeMenuBar.actionMapActionMapMenuBar.backgroundColorMenuBar.borderBorderMenuBar.borderColorColorMenuBar.darkShadowColorMenuBar.fontFontMenuBar.foregroundColorMenuBar.gradientListMenuBar.highlightColorMenuBar.shadowColorMenuBar.windowBindingsObject[ ]MenuBarUIString


Menu Accelerator

   <source lang="java">

import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.KeyStroke; public class MenuAcceleratorKeyStroke extends JFrame {

 public MenuAcceleratorKeyStroke() {
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JMenuBar bar = new JMenuBar();
   JMenu menu = new JMenu("File");
   menu.setMnemonic("f");
   bar.add(menu);
   JMenuItem exit = new JMenuItem("Exit");
   exit.setMnemonic("x");
   exit.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       System.out.println("Exit performed");
       MenuAcceleratorKeyStroke.this.dispose();
       System.exit(0);
     }
   });
   menu.add(exit);
   menu = new JMenu("Edit");
   menu.setMnemonic("e");
   bar.add(menu);
   EditListener l = new EditListener();
   JMenuItem mi;
   mi = menu.add(new JMenuItem("Cut", "t"));
   mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));
   mi.addActionListener(l);
   mi = menu.add(new JMenuItem("Copy", "c"));
   mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));
   mi.addActionListener(l);
   mi = menu.add(new JMenuItem("Paste", "p"));
   mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK));
   mi.addActionListener(l);
   setJMenuBar(bar);
   getContentPane().add(new JLabel("A placeholder"));
   pack();
   setSize(300, 300);
   setVisible(true);
 }
 private class EditListener implements ActionListener {
   public void actionPerformed(ActionEvent e) {
     System.out.println(e.getActionCommand());
   }
 }
 public static void main(String arg[]) {
   new MenuAcceleratorKeyStroke();
 }

}</source>





Shows how to right-align a menu in the menu bar, using a glue component

   <source lang="java">

/*

*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import javax.swing.Box; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; /**

* @author ges
* @author kwalrath
*/

/* MenuGlueDemo.java requires no other files. */ public class MenuGlueDemo {

 public JMenuBar createMenuBar() {
   JMenuBar menuBar = new JMenuBar();
   menuBar.add(createMenu("Menu 1"));
   menuBar.add(createMenu("Menu 2"));
   menuBar.add(Box.createHorizontalGlue());
   menuBar.add(createMenu("Menu 3"));
   return menuBar;
 }
 public JMenu createMenu(String title) {
   JMenu m = new JMenu(title);
   m.add("Menu item #1 in " + title);
   m.add("Menu item #2 in " + title);
   m.add("Menu item #3 in " + title);
   return m;
 }
 /**
  * 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("MenuGlueDemo");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   // Create and set up the content pane.
   MenuGlueDemo demo = new MenuGlueDemo();
   frame.setContentPane(demo.createMenuBar());
   // Display the window.
   frame.setSize(300, 100);
   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();
     }
   });
 }

}</source>





Vertical menu bar

If you want a vertical menu bar, simply change the LayoutManager of the menu bar component.



   <source lang="java">

import java.awt.GridLayout; import java.awt.LayoutManager; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; class VerticalMenuBar extends JMenuBar {

 private static final LayoutManager grid = new GridLayout(0,1);
 public VerticalMenuBar() {
   setLayout(grid);
 }

}

public class VerticalMenuBarDemo {

 public static void main(final String args[]) {
   JFrame frame = new JFrame("MenuSample Example");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JMenuBar menuBar = new VerticalMenuBar();
   // File Menu, F - Mnemonic
   JMenu fileMenu = new JMenu("File");
   fileMenu.setMnemonic(KeyEvent.VK_F);
   menuBar.add(fileMenu);
   JMenu editMenu = new JMenu("Edit");
   menuBar.add(editMenu);
   
   frame.setJMenuBar(menuBar);
   frame.setSize(350, 250);
   frame.setVisible(true);
 }

}</source>