La adición de un JMenu a un JPanel

Necesito tener un JMenu (la de la flecha en la derecha que puede mostrar JMenuItem) en un JPanel. El problema es que cuando hago que la JMenu no se activa pasar el ratón por encima…
No sé cómo hacerlo, y si es posible.

  • Agregar JMenus a un JMenuBar, y se llama setJMenuBar() método de un JFrame – no creo que usted puede añadir a una JPanel. Y asegúrese de que su JMenu está llena de elementos!
  • Hola, sé que esta solución pero no es la que yo quiero. Realmente quiero un JMenu directamente en un JPanel… Este es el problema.
  • A continuación, considere el uso de un JDesktopPane con JInternalFrames, o definir su propia JComponent.
  • Esto es viejo, pero lo que quería señalar que esta respuesta es relativa. stackoverflow.com/questions/4299846/add-jmenubar-to-a-jpanel
InformationsquelleAutor paranoia25 | 2013-02-08

3 Kommentare

  1. 3

    Si ajusta su JMenu en un JMenuBar, que funciona como se espera.

    Aquí es una demostración ejemplo:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.SwingUtilities;
    
    public class TestMenus {
    
        private JMenuBar createMenuBar(String name, int depth) {
            JMenuBar bar = new JMenuBar();
            bar.add(createMenu(name, depth));
            return bar;
        }
    
        private JMenu createMenu(String name, int depth) {
            JMenu menu = new JMenu(name);
            for (int i = 0; i < 5; i++) {
                if (depth > 0) {
                    menu.add(createMenu("sub-" + name, depth - 1));
                }
            }
            for (int i = 0; i < 5; i++) {
                menu.add(createMenuItem("Menu item " + (i + 1)));
            }
            return menu;
        }
    
        private JMenuItem createMenuItem(String name) {
            final JMenuItem jMenuItem = new JMenuItem(name);
            jMenuItem.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(jMenuItem, "Successfully pressed a menu item");
                }
            });
            return jMenuItem;
        }
    
        protected void initUI() {
            JFrame frame = new JFrame(TestMenus.class.getSimpleName());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(createMenuBar("Root menu", 3));
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new TestMenus().initUI();
                }
            });
        }
    
    }

    Un resultado:

    La adición de un JMenu a un JPanel

    • Hola! Este no es el aspecto que me gustaría. Me gustaría que la JMenu aparecen directamente en el panel (no el de la JMenuBar).
    • tu pregunta no es clara acerca de eso. Si puso un SSCCE usted tendría una mejor respuesta directamente. Ahora en cuanto a tu problema, no me gustaría añadir un JMenu directamente a la JPanel sino más bien un JButton con un ActionListener que se abre un JPopupMenu. Para hacer la JButton parecer un JMenu, usted probablemente tendrá que hacer algunos de personalización y acceso de L&F predeterminados.
    • +1 Un JToolBar puede ser una alternativa atractiva Container para la JMenuBar, como se muestra aquí.
  2. 2

    Aquí es otra forma de solucionar esto que creo que está más cerca de lo que usted desea. Esto implica extender JMenuBar para darle el aspecto de un JMenu Objeto.

    La clase contiene un JMenu Objeto llamado menú. El complemento de los métodos que se reemplaza así que usted está agregando al menú en lugar de la JMenuBar (puede Que tenga que reemplazar un par de más añadir métodos a que esta perfecto).

    Hay un par de opciones con la pintura. Yo no estaba seguro de si quería que el botón estilo de la JMenuBar, así que he incluido un par de comentarios sobre algunas de las opciones para personalizar, así como el subrayado de la mirada de la JMenuBar.

    Aquí es el resultado de el botón buscar sin frontera:
    La adición de un JMenu a un JPanel

    Aquí está el resultado con » sin mirar botón y sin borde:
    La adición de un JMenu a un JPanel

    import java.awt.*;
    import javax.swing.*;
    
    public class JPanelMenu extends JMenuBar{
    
    public static void main(String[] args) {
        JFrame f = new JFrame("Menu Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        JMenu jmenu = new JMenu("J Menu");
        jmenu.add(new JMenuItem("Menu Item"));
    
        JPanelMenu m = new JPanelMenu("Menu");
        m.add(jmenu);
        m.add(new JMenuItem("Menu Item 1"));
        m.add(new JMenuItem("Menu Item 2"));
    
        JPanel background = new JPanel();
        background.add(m);      
        f.setContentPane(background);
        f.pack();
        f.setVisible(true);
    }
    
    //This is the JMenu that is shown
    private JMenu menu;
    
    public JPanelMenu(String title) {
        super();
        menu = new JMenu(title);
        super.add(menu);
    }
    
    @Override
    public Component add(Component comp) {
        //You add the the JMenu instead of the JMenuBar
        return menu.add(comp);
    }
    
    @Override
    public JMenu add(JMenu c) {
        //You add the the JMenu instead of the JMenuBar
        return (JMenu) menu.add(c);
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    
        //Include these two lines to remove the button look
        //Or remove this method to keep the button look
        //g.setColor(getBackground());
        //g.fillRect(0, 0, getWidth(), getHeight());
    }
    
    @Override
    protected void paintBorder(Graphics g) {
        //Remove this line to remove the underline look
        //when you remove the button look
        //An alternative is to you setBorderPainted(false);
        //when you create the object or in the constructor
        //Or remove this method to keep the border
        //super.paintBorder(g);
    }
    }
    • Hola! Esta es la más cerca de la solución! Pero esto aún no se exactamente lo que estoy buscando. Me gustaría que un JMenu directamente en un JPanel.En la solución de la JMenu se encuentra todavía en un JMenuBar y el usuario tiene que hacer clik en la JMenuBar a ver y tener acceso a la JMenu.
    • que yo sepa, no hay manera de hacer eso porque se necesita un JMenuBar para que funcione. Esta solución utiliza un JMenuBar, pero usted puede hacer que parezca como por allí no hay nadie por meterse con la Pintura de los métodos.
  3. 0

    Debe pasar un BorderLayout en JPanel diseño entonces usted puede agregar la barra de menú en el panel:

    JPanel p = new JPanel();
    p.setLayout(new BorderLayout());
    p.add(menubar, BorderLayout.NORTH);
    • Y qué sería un cambio a la JMenu? La sustitución de un FlowLayout por un BorderLayout impactos tamaño y ubicación, pero no el comportamiento.
    • He probado el ejemplo y funciona y tiene un comportamiento normal .
    • Qué ejemplo? 3 líneas de código no es un ejemplo.
    • HOLA! El problema es que no quiero un JMenuBar en un JPanel pero un JMenu en un JPanel.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea