2012-11-22 1 views
2

Je travaille sur un simple GUI.Pourquoi mon JmenuBar ne montre pas

Je n'arrive pas à voir la raison pour laquelle mon JMenuBar n'apparaît pas. Qu'est-ce que je rate?

Voici le code ci-dessous.

myMenuBar = new JMenuBar(); 
    myFileMenu = new JMenu("File"); 
    myRegisterItem = new JMenuItem("Register"); 
    myMenuBar.add(myFileMenu); 
    myFileMenu.add(myRegisterItem); 
    setJMenuBar(myMenuBar); 

La classe complète:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.rmi.Naming; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 


public class GUI extends JFrame{ 


private JTextArea recievedField; 
private JButton sendButton; 
private JTextField messageField; 
private JComboBox itemComboBox; 
private JButton connectButton; 
private JTextField userNameField; 
private JPasswordField passwordField; 
private JButton loginButton; 
private JMenuBar myMenuBar; 
private JMenu myFileMenu; 
private JMenuItem myRegisterItem; 


public static void main(String[] args) { 
    new GUI(); 
} 

public GUI() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 

       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      JFrame frame = new JFrame("GUI"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 
      frame.add(new MainPane()); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 

    }); 
} 

public class MainPane extends JPanel { 

    public MainPane() { 


     myMenuBar = new JMenuBar(); 
     setJMenuBar(myMenuBar); 
     myFileMenu = new JMenu("File"); 
     myRegisterItem = new JMenuItem("Register"); 
     myMenuBar.add(myFileMenu); 
     myFileMenu.add(myRegisterItem); 


     setBorder(new EmptyBorder(4, 4, 4, 4)); 
     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.weightx = 1; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     add(new LoginPane(), gbc); 
     gbc.gridy++; 
     add(new ConnectPane(), gbc); 
     gbc.gridy++; 
     gbc.weighty = 1; 
     gbc.fill = GridBagConstraints.BOTH; 
     add(new JScrollPane(recievedField = new JTextArea(5, 20)), gbc); 

     gbc.gridwidth = 1; 

     messageField = new JTextField(10); 
     sendButton = new JButton("Send"); 

     gbc.gridy++; 
     gbc.weighty = 0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     add(messageField, gbc); 
     gbc.gridx++; 
     gbc.weightx = 0; 
     gbc.insets = new Insets(5,5,5,5); 
     add(sendButton, gbc);   



    } 

} 

public class ConnectPane extends JPanel { 

    public ConnectPane() { 

     itemComboBox = new JComboBox(); 
     itemComboBox.addItem("Select an Item"); 
     connectButton = new JButton("Connect"); 

     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.insets = new Insets(5,5,5,5); 
     add(itemComboBox, gbc); 

     gbc.gridx++; 
     gbc.weightx = 1; 
     gbc.insets = new Insets(5,5,5,5); 
     add(connectButton, gbc); 
    } 

} 

public class LoginPane extends JPanel { 

    public LoginPane() { 

     userNameField = new JTextField(10); 
     passwordField = new JPasswordField(10); 
     loginButton = new JButton("Login"); 

     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.insets = new Insets(5,5,5,5); 
     add(new JLabel("User name:"), gbc); 

     gbc.gridx++; 
     gbc.insets = new Insets(5,5,5,5); 
     add(userNameField, gbc); 

     gbc.gridx++; 
     gbc.insets = new Insets(5,5,5,5); 
     add(new JLabel("Password:"), gbc); 

     gbc.gridx++; 
     gbc.insets = new Insets(5,5,5,5); 
     add(passwordField, gbc); 

     gbc.gridx++; 
     gbc.weightx = 1; 
     add(loginButton, gbc); 

    } 

} 

Répondre

2

Votre problème est vous appelez setJMenuBar sur JPanel exemple cela est faux, vous devriez appeler:

frame.setJMenuBar(myMenuBar); 

pas besoin aussi pour:

frame.setLayout(new BorderLayout()); 

en tant que JFramecontentPane mise en page par défaut est BorderLayout

-à-dire changer votre code:

  JFrame frame = new JFrame("GUI"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(new MainPane()); 
      frame.setJMenuBar(myMenuBar); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 

Aussi ne pas utiliser EventQueue plutôt SwingUtilities:

SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 

      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      JFrame frame = new JFrame("GUI"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(new MainPane()); 
      frame.setJMenuBar(myMenuBar); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 

Ne pas oublier de commenter le setJmenuBar(..) dans votre classe MainPane:

public MainPane() { 
     myMenuBar = new JMenuBar(); 

     //notice no call to setJMenuBar 

     myFileMenu = new JMenu("File"); 
     myRegisterItem = new JMenuItem("Register"); 
     myMenuBar.add(myFileMenu); 

     ... 
    } 
+1

C'est une bonne réponse, 1+. Je suis surpris que le code de l'affiche originale ait même été compilé puisque JPanel n'a même pas de méthode 'setJMenuBar (...)'. Notez que vous pouvez ajouter JMenuBars à n'importe quel conteneur, mais si vous faites cela, vous devez prendre soin d'utiliser les bons gestionnaires de disposition (généralement BorderLayout et ajouté à la position NORTH), et assurez-vous que son conteneur est correctement ajouté à l'interface graphique. –

+0

@HovercraftFullOfEels oui J'étais trop ... Mais à propos du (habituellement 'BorderLayout' et ajouté à la position NORD) je trouve aussi longtemps que vous ajoutez via' setJMenuBar' la position est prise en charge si (bien pour défaut 'BorderLayout' atleast –

+0

@HovercraftFullOfEels assez drôle de code original compile (sauf pour accolade manquante à la fin de la classe) Je suppose que l'un des composants 'JPanel' hérite a' setJMenuBar': O? –

0

Son parce que vous avez défini votre JMenuBar visible.

Ajoutez ceci à votre code

frame.setJMenuBar(myMenuBar); // This line to be added 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
+0

Je viens d'ajouter cela et il ne montre toujours pas –

+0

@DavidKroukamp oui cela fonctionne sans setVisible aussi. Mais qu'en est-il de la chose EventQueue Thing et SwingUtilities? Pouvez-vous s'il vous plaît Expliquez-moi. Je n'ai pas de connaissance à ce sujet. –

+1

@IshanKhanna indépendamment de son un hack et ne devrait pas être fait de cette façon. EventQueue est awt import 'SwingUtilities' est l'importation swing. juste se sent bien IMO, et dans la plupart des tutoriel java, y compris la leçon de concurrence swing SwingUtilities est utilisé. –

Questions connexes