2012-02-18 35 views
6

Tengo problemas y realmente no entiendo por qué. Tengo un JFrame y un JPanel y todo funciona correctamente. Estoy tratando de agregar un jMenuBar en JPanel y no puedo mostrarlo. Se está colocando en "Otros componentes" y no aparece durante el tiempo de ejecución. ¿alguna sugerencia?En NetBeans ¿cómo agrego un jMenuBar a un JPanel?

editar: Parece que la respuesta correcta es NetBeans no puede agregar un JMenu a un JFrame. Quería agregar esto a la primera publicación porque la respuesta adecuada a continuación fue rechazada.

+0

Posible duplicado de [agregar JMenuBar a un JPanel?] (http://stackoverflow.com/questions/4299846/add-jmenubar-to-a-jpanel) – ryvantage

Respuesta

6

Uno de la manera más inteligente es haga doble clic en JFrame que se encuentra en la barra proyecto esto aparece una nueva ventana con JFrame real en la barra de la paleta lado izquierdo aparece allí es todos los componentes de la oscilación tienes que sólo se arrastre y colocar el elemento en este marco el código será creado automáticamente por nb también puede agregar un evento a ese elemento haciendo clic derecho en él

8

JMenuBar se agrega al JFrame utilizando el método setJMenuBar(...).

Pequeño código para ayudar a su causa:

import javax.swing.*; 

public class MenuBarTest extends JFrame 
{ 
    public MenuBarTest() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     JPanel contentPane = new JPanel(); 
     contentPane.setBackground(java.awt.Color.WHITE); 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu menu = new JMenu("File"); 
     JMenuItem menuItem = new JMenuItem("Open"); 

     menu.add(menuItem); 
     menuBar.add(menu); 

     setContentPane(contentPane); 
     setJMenuBar(menuBar); 
     setSize(200, 200); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new MenuBarTest(); 
      } 
     }); 
    } 
} 
4

Desde un JMenuBar deriva de JComponent se puede añadir a cualquier recipiente (por lo general uno usando BorderLayout a la posición BorderLayout.PAGE_START), que es más comúnmente agregado a JApplet, JDialog, JFrame, JInternalFrame, JRootPane mediante el método setJMenuBar(...).

http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

Sólo una pequeña adición:

Una barra de menús contiene uno o más menús y tiene una ubicación habitual, dependiente de la plataforma - por lo general a lo largo de la parte superior de una ventana.

+0

¿Cómo hago referencia a eso? Estoy teniendo problemas para que se muestre en mi JFrame? Se sigue poniendo en "Otros componentes". – AdamOutler

+0

Lo siento, pero esto está muy mal. Si desea agregar JMenuBar a cualquier componente, puede hacerlo. -1 voto. –

+0

Consulte el código de ejemplo que lo demuestra. Por favor borre su respuesta ya que es muy engañoso. He dejado una bandera para que los moderadores eliminen esta respuesta si no lo hacen. –

5

Para vextorspace quien afirma:

JMenuBar sólo se pueden añadir a JFrames, JDialogs y JApplets.

Este ejemplo demuestra que es fácil de añadir JMenuBar a un JPanel (o cualquier recipiente para el caso):

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

public class MenuBarEg { 
    private static void createAndShowGui() { 
     final JFrame frame = new JFrame("MenuBar Exampe"); 

     JMenuItem barItem = new JMenuItem(new AbstractAction("Bar") { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      JOptionPane.showMessageDialog(frame, "Hello from bar!"); 
     } 
     }); 
     JMenu fooMenu = new JMenu("Foo"); 
     fooMenu.add(barItem); 
     JMenuBar menuBar = new JMenuBar(); 
     menuBar.add(fooMenu); 

     JPanel menuBarHoldingPanel = new JPanel(new BorderLayout()); 
     menuBarHoldingPanel.add(menuBar, BorderLayout.PAGE_START); 

     JPanel mainPanel = new JPanel(new GridLayout(0, 1)); 

     // rigid area just as a place-holder 
     mainPanel.add(Box.createRigidArea(new Dimension(400, 150))); 
     mainPanel.add(menuBarHoldingPanel); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Esto no sólo es fácil de hacer, hay muchos casos en los que esto es deseable.

+0

vextorspace fue en realidad spot-on. Sin embargo, ahora estoy trabajando con un error de desbordamiento de pila al convertir de un JPanel a un JFrame. – AdamOutler

+0

@AdamOutler: Lo siento pero te equivocas en esto. Su afirmación de que cito arriba es completamente falsa. Si me estás diciendo que estoy equivocado, haz una copia de seguridad con código para probarlo porque creo que sé un poco más acerca de Swing que tú y ciertamente más que vextorspace. Sí, puedes resolver tu problema haciendo que tu clase amplíe JFrame, pero esa no siempre es la mejor manera. Si mostró más de su código, creo que podría mostrarle una mejor manera, pero el resultado final es que vextorspace no debe difundir información falsa que lo engañará a usted y a los demás. –

+1

Simplemente estaba yendo con qué componentes tenía una rutina setMenuBar(), pero siempre me molestaba por no poder agregarlo a un Panel, ¡voy a dar una oportunidad! – vextorspace