All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.samskivert.swing.util.MenuUtil Maven / Gradle / Ivy

There is a newer version: 1.9
Show newest version
//
// $Id$
//
// samskivert library - useful routines for java programs
// Copyright (C) 2001-2010 Michael Bayne, et al.
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

package com.samskivert.swing.util;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.lang.reflect.Method;

import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;

import static com.samskivert.Log.log;

/**
 * The menu util class provides miscellaneous useful utility routines for
 * working with menus. Adding a menu item with both a mnemonic and an
 * accelerator to a menu in a frame that listens to its own menus (a
 * common case) can be simplified like so:
 *
 * 
 * accel = KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK);
 * MenuUtil.addMenuItem(this, menuFile, "New", KeyEvent.VK_N, acc);
 * 
*/ public class MenuUtil { /** * Adds a new menu item to the menu with the specified name and * attributes. * * @param l the action listener. * @param menu the menu to add the item to. * @param name the item name. * @param mnem the mnemonic key for the item or null if none. * @param accel the keystroke for the item or null if none. * * @return the new menu item. */ public static JMenuItem addMenuItem ( ActionListener l, JMenu menu, String name, Integer mnem, KeyStroke accel) { JMenuItem item = createItem(name, mnem, accel); item.addActionListener(l); menu.add(item); return item; } /** * Adds a new menu item to the menu with the specified name and * attributes. * * @param l the action listener. * @param menu the menu to add the item to. * @param name the item name. * @param mnem the mnemonic key for the item. * @param accel the keystroke for the item or null if none. * * @return the new menu item. */ public static JMenuItem addMenuItem ( ActionListener l, JMenu menu, String name, int mnem, KeyStroke accel) { return addMenuItem(l, menu, name, Integer.valueOf(mnem), accel); } /** * Adds a new menu item to the menu with the specified name and * attributes. * * @param l the action listener. * @param menu the menu to add the item to. * @param name the item name. * @param mnem the mnemonic key for the item. * * @return the new menu item. */ public static JMenuItem addMenuItem ( ActionListener l, JMenu menu, String name, int mnem) { return addMenuItem(l, menu, name, Integer.valueOf(mnem), null); } /** * Adds a new menu item to the menu with the specified name. * * @param l the action listener. * @param menu the menu to add the item to. * @param name the item name. * * @return the new menu item. */ public static JMenuItem addMenuItem ( ActionListener l, JMenu menu, String name) { return addMenuItem(l, menu, name, null, null); } /** * Adds a new menu item to the menu with the specified name and * attributes. The supplied method name will be called (it must have * the same signature as {@link ActionListener#actionPerformed} but * can be named whatever you like) when the menu item is selected. * * @param menu the menu to add the item to. * @param name the item name. * @param mnem the mnemonic key for the item. * @param accel the keystroke for the item or null if none. * @param target the object on which to invoke a method when the menu is selected. * @param callbackName the name of the method to invoke when the menu is selected. * * @return the new menu item. */ public static JMenuItem addMenuItem ( JMenu menu, String name, int mnem, KeyStroke accel, Object target, String callbackName) { JMenuItem item = createItem(name, Integer.valueOf(mnem), accel); item.addActionListener(new ReflectedAction(target, callbackName)); menu.add(item); return item; } /** * Adds a new menu item to the menu with the specified name and * attributes. The supplied method name will be called (it must have * the same signature as {@link ActionListener#actionPerformed} but * can be named whatever you like) when the menu item is selected. * * @param menu the menu to add the item to. * @param name the item name. * @param target the object on which to invoke a method when the menu is selected. * @param callbackName the name of the method to invoke when the menu is selected. * * @return the new menu item. */ public static JMenuItem addMenuItem ( JMenu menu, String name, Object target, String callbackName) { JMenuItem item = createItem(name, null, null); item.addActionListener(new ReflectedAction(target, callbackName)); menu.add(item); return item; } /** * Adds a new menu item to the popup menu with the specified name and * attributes. The supplied method name will be called (it must have * the same signature as {@link ActionListener#actionPerformed} but * can be named whatever you like) when the menu item is selected. * *

Note that this JPopupMenu-specific implementation * exists solely because JPopupMenu doesn't extend * JMenu and so we have to explicitly call {@link * JPopupMenu#add} rather than {@link JMenu#add}. * * @param menu the menu to add the item to. * @param name the item name. * @param target the object on which to invoke a method when the menu is selected. * @param callbackName the name of the method to invoke when the menu is selected. * * @return the new menu item. */ public static JMenuItem addMenuItem ( JPopupMenu menu, String name, Object target, String callbackName) { JMenuItem item = createItem(name, null, null); item.addActionListener(new ReflectedAction(target, callbackName)); menu.add(item); return item; } /** * Creates and configures a menu item. */ protected static JMenuItem createItem (String name, Integer mnem, KeyStroke accel) { JMenuItem item = new JMenuItem(name); if (mnem != null) { item.setMnemonic(mnem.intValue()); } if (accel != null) { item.setAccelerator(accel); } return item; } /** * Used to wire menu items directly up to method calls. */ protected static class ReflectedAction implements ActionListener { public ReflectedAction (Object target, String methodName) { try { // look up the method we'll be calling _method = target.getClass().getMethod(methodName, METHOD_ARGS); _target = target; } catch (Exception e) { log.warning("Unable to obtain menu callback method. Item will not function.", "target", target, "method", _method, "error", e); } } public void actionPerformed (ActionEvent event) { if (_method != null) { try { _method.invoke(_target, new Object[] { event }); } catch (Exception e) { log.warning("Failure invoking menu callback", "target", _target, "method", _method, e); } } } /** The object on which to invoke the reflected method. */ protected Object _target; /** The method to call when the menu item is invoked. */ protected Method _method; } /** The method signature for menu callback methods. */ protected static final Class[] METHOD_ARGS = new Class[] { ActionEvent.class }; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy