2012-02-18 15 views
6

Ho problemi e non capisco davvero perché. Ho un JFrame e un JPanel e tutto funziona correttamente. Sto cercando di aggiungere un jMenuBar nello JPanel e non riesco a farlo apparire. Viene inserito in "Altri componenti" e non viene visualizzato durante il runtime. eventuali suggerimenti?In NetBeans come aggiungo un jMenuBar a un JPanel?

modifica: Sembra che la risposta appropriata sia NetBeans non può aggiungere un JMenu a un JFrame. Volevo aggiungere questo al primo post perché la risposta appropriata di seguito è stata rifiutata.

+0

Possibile duplicato di [aggiungere JMenuBar a un JPanel?] (http://stackoverflow.com)/questions/4299846/add-jmenubar-to-a-jpanel) – ryvantage

risposta

6

Uno dei modi smart è doppio click su JFrame che è al bar progetto questo appare una nuova finestra con l'attuale JFrame al bar palette lato sinistro sembra che ci sia tutti i componenti dello swing dovete solo trascinare e rilasciare l'elemento su questo Frame il codice verrà automaticamente creato da nb è anche possibile aggiungere un evento a quell'elemento facendo clic con il tasto destro su di esso

8

JMenuBar viene aggiunto a JFrame utilizzando il metodo setJMenuBar(...).

piccolo codice per aiutare la vostra 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

Dal momento che un JMenuBar deriva da JComponent può essere aggiunto a qualsiasi contenitore (di solito uno che utilizza BorderLayout alla posizione BorderLayout.PAGE_START), è più comunemente aggiunto a JApplet, JDialog, JFrame, JInternalFrame, JRootPane tramite il metodo setJMenuBar(...).

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

Basta una piccola aggiunta:

Una barra dei menu contiene uno o più menu e ha una posizione consueta dipendente dalla piattaforma - di solito lungo la parte superiore di una finestra.

+0

Come faccio a fare riferimento? Sto riscontrando problemi nel far comparire il mio JFrame? Continua a essere messo sotto "Altri componenti". – AdamOutler

+0

Siamo spiacenti, ma questo è molto sbagliato. Se si desidera aggiungere JMenuBar a qualsiasi componente, si è liberi di farlo. Voto -1. –

+0

Si prega di consultare il codice di esempio che dimostra questo sbagliato. Si prega di cancellare la risposta in quanto è molto fuorviante. Ho lasciato una bandiera per i moderatori per cancellare questa risposta se non lo farai. –

5

Per vextorspace che afferma:

JMenuBar possono essere aggiunti solo per JFrames, JDialogs e JApplets.

Questo esempio mostra che è facile aggiungere JMenuBar a un JPanel (o qualsiasi contenitore per questo):

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(); 
     } 
     }); 
    } 
} 

Non solo questo è facile da fare, ci sono molti casi in cui questo è auspicabile.

+0

vextorspace era in realtà spot-on. Tuttavia ora sto lavorando con un errore di overflow dello stack dalla conversione da JPanel a JFrame. – AdamOutler

+0

@AdamOutler: mi dispiace ma ti sbagli in questo. La sua affermazione che cito sopra è completamente falsa. Se mi stai dicendo che ho torto, ti preghiamo di fare un backup con codice per dimostrarlo, perché penso di conoscere un po 'più di Swing di te e sicuramente più di vextorspace. Sì, puoi risolvere il tuo problema facendo in modo che la tua classe estenda JFrame, ma non è sempre il modo migliore. Se mostri più del tuo codice, penso che potrei mostrarti un modo migliore, ma la linea di fondo è vextorspace non dovrebbe diffondere false informazioni che possano fuorviare te e gli altri. –

+1

Stavo semplicemente andando con i componenti con una routine setJMenuBar(), ma sono sempre stato infastidito dal fatto di non essere in grado di aggiungerlo a un Panel, darò uno scatto! – vextorspace

Problemi correlati