Java JMenuBar cloneMenuBar(final JMenuBar menubar)

Here you can find the source of cloneMenuBar(final JMenuBar menubar)

Description

Creates a copy of this menu bar, whose contents update automatically whenever the original menu bar changes.

License

Open Source License

Declaration

public static JMenuBar cloneMenuBar(final JMenuBar menubar) 

Method Source Code

//package com.java2s;
/*/*from  www .  ja v a 2 s .  c  om*/
 * #%L
 * VisBio application for visualization of multidimensional biological
 * image data.
 * %%
 * Copyright (C) 2002 - 2014 Board of Regents of the University of
 * Wisconsin-Madison.
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 2 of the
 * License, or (at your option) any later version.
 * 
 * This program 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-2.0.html>.
 * #L%
 */

import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import javax.swing.KeyStroke;

public class Main {
    /**
     * Creates a copy of this menu bar, whose contents update automatically
     * whenever the original menu bar changes.
     */
    public static JMenuBar cloneMenuBar(final JMenuBar menubar) {
        if (menubar == null)
            return null;
        final JMenuBar jmb = new JMenuBar();
        final int count = menubar.getMenuCount();
        for (int i = 0; i < count; i++)
            jmb.add(cloneMenuItem(menubar.getMenu(i)));
        return jmb;
    }

    /**
     * Creates a copy of this menu item, whose contents update automatically
     * whenever the original menu item changes.
     */
    public static JMenuItem cloneMenuItem(final JMenuItem item) {
        if (item == null)
            return null;
        JMenuItem jmi;
        if (item instanceof JMenu) {
            final JMenu menu = (JMenu) item;
            final JMenu jm = new JMenu();
            final int count = menu.getItemCount();
            for (int i = 0; i < count; i++) {
                final JMenuItem ijmi = cloneMenuItem(menu.getItem(i));
                if (ijmi == null)
                    jm.addSeparator();
                else
                    jm.add(ijmi);
            }
            jmi = jm;
        } else
            jmi = new JMenuItem();
        final ActionListener[] l = item.getActionListeners();
        for (int i = 0; i < l.length; i++)
            jmi.addActionListener(l[i]);
        jmi.setActionCommand(item.getActionCommand());
        syncMenuItem(item, jmi);
        linkMenuItem(item, jmi);
        return jmi;
    }

    /** Brings the destination menu item into sync with the source item. */
    protected static void syncMenuItem(final JMenuItem source, final JMenuItem dest) {
        final boolean enabled = source.isEnabled();
        if (dest.isEnabled() != enabled)
            dest.setEnabled(enabled);
        final int mnemonic = source.getMnemonic();
        if (dest.getMnemonic() != mnemonic)
            dest.setMnemonic(mnemonic);
        final String text = source.getText();
        if (dest.getText() != text)
            dest.setText(text);
        final KeyStroke accel = source.getAccelerator();
        if (dest.getAccelerator() != accel)
            dest.setAccelerator(accel);
    }

    /**
     * Forces slave menu item to reflect master menu item using a property change
     * listener.
     */
    protected static void linkMenuItem(final JMenuItem master, final JMenuItem slave) {
        final JMenuItem source = master, dest = slave;
        source.addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(final PropertyChangeEvent e) {
                syncMenuItem(source, dest);
            }
        });
    }
}

Related

  1. addFastKeys(JMenuBar menuBar)
  2. addMenuItems(JMenuBar menu, JComponent... items)
  3. applyDefaultProperties(final JMenuBar comp)
  4. createMenuInMenuBar(final JMenuBar menuBar, final String menuName)
  5. findItem(JMenuBar menuBar, String menuName, String menuItemName)
  6. findMenu(JMenuBar bar, Class type)
  7. findMenu(JMenuBar menuBar, String menuName)