2016-08-24 3 views
1

Wenn der Rahmen aboutWindow geöffnet ist, ist nur die Beschriftung (-Inhalt) name sichtbar, die Menüleiste fehlt. Wenn die Beschriftung auskommentiert ist, wird die Leiste angezeigt, füllt jedoch den gesamten Rahmen aus. Was vermisse ich?JLabel überschreibt JMenuBar

import javax.swing.*; 
import java.net.*; 
import java.awt.event.*; 

public class Main 
{ 

    public static JDialog aboutWindow; 

    public static void about() { 
    //JDialog aboutWindow = new JDialog(); 
    Main.aboutWindow = new JDialog(); 
    Main.aboutWindow.setTitle("About kingfisher a0.0.3"); 
    Main.aboutWindow.setSize(300,600); 
    Main.aboutWindow.setModal(true); 
     JMenuBar menubar = new JMenuBar(); 
      JMenu control = new JMenu("Control"); 
       JMenuItem quit = new JMenuItem("quit"); 
        quit.addActionListener(new ActionListene121r() { 
         public void actionPerformed(ActionEvent event) { 
          Main.aboutWindow.setVisible(false); 
          } 
         } 
        ); 
       control.add(quit); 
      menubar.add(control); 
     Main.aboutWindow.add(menubar); 
    JLabel name = new JLabel("kingfisher"); 
    Main.aboutWindow.add(name); 
    Main.aboutWindow.setVisible(false); 
    } 


    public static void main (String args[]){ 
    //Defined window dimensions 
    JFrame controlpanel = new JFrame(); 
    controlpanel.setTitle("kingfisher Control Panel"); 
    controlpanel.setSize(500,400); 
    controlpanel.add(new JLabel("The angels have the blue box")); 
     JMenuBar menubar = new JMenuBar(); 
     //defining menu groups 
      JMenu windows = new JMenu("Windows"); 
       JCheckBoxMenuItem chat = new JCheckBoxMenuItem("Chat"); 
       JCheckBoxMenuItem filetransfer = new JCheckBoxMenuItem("Filetransfer"); 
       JCheckBoxMenuItem settings = new JCheckBoxMenuItem("Settings"); 
       windows.add(chat); 
       windows.add(filetransfer); 
       windows.add(settings); 
      JMenu control = new JMenu("Control"); 
       JMenuItem quit = new JMenuItem("Quit"); 
       quit.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent event) { 
         System.exit(0); 
         } 
        } 
       ); 
       control.add(quit); 
      JMenu help = new JMenu("Help"); 
       JMenuItem support = new JMenuItem("Support"); 
       JMenuItem about = new JMenuItem("About"); 
        about.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent event) { 
          Main.aboutWindow.setVisible(true); 
          } 
         } 
        ); 
       help.add(support); 
       help.add(about); 
      menubar.add(control); 
      menubar.add(windows); 
      menubar.add(help); 
     controlpanel.setJMenuBar(menubar); 
    controlpanel.setVisible(true); 
    }; 
}; 
+0

Ausführen dieses Codes (nach dem Ändern von 'neuen ActionListene121r' zu' neuen ActionListener') erzeugt eine "NullPointerException" hier. –

+0

oops, diese Tippfehler waren nicht beabsichtigt. aber die 'NullPointerExeption', kann ich nicht sehen. Auf welches LOC bezieht sich der Fehler? – sam4ritan

+0

das ist eine interessante Art der Formatierung, um es gelinde auszudrücken ... Ihre Tabs sind überall im Shop – Drgabble

Antwort

3

Statt die JMenuBar der Zugabe:

Main.aboutWindow.add(menubar, BorderLayout.NORTH); 

Oder als @ControlAltDel Verwendung der Standardmethode zum Hinzufügen eines Menüleiste zu einem Dialog erwähnt Verwenden Sie JDialog.setJMenuBar

Main.aboutWindow = new JDialog(); 
    Main.aboutWindow.setTitle("About kingfisher a0.0.3"); 
    Main.aboutWindow.setSize(300,600); 
    Main.aboutWindow.setModal(true); 
     JMenuBar menubar = new JMenuBar(); 
      JMenu control = new JMenu("Control"); 
       JMenuItem quit = new JMenuItem("quit"); 
        quit.addActionListener(new ActionListene121r() { 
         public void actionPerformed(ActionEvent event) { 
          Main.aboutWindow.setVisible(false); 
          } 
         } 
        ); 
       control.add(quit); 
      menubar.add(control); 

     Main.aboutWindow.setJMenuBar(menubar); //changed 

    JLabel name = new JLabel("kingfisher"); 
    Main.aboutWindow.add(name); 
    Main.aboutWindow.setVisible(false); 
+0

Danke, das ist, was ich gesucht habe – sam4ritan

1

Die JDialog verwendet ein BorderLayout Layout standardmäßig, wenn man Komponenten auf diese Art von Layout hinzugefügt werden, ohne die Position anzugeben, sie in der Mitte hinzugefügt werden (die vorherige Komponente in der Mitte hinzugefügt ersetzen).

Ihr JLabel ersetzt das JMenuBar, weil es danach hinzugefügt wird.

Sie können etwas tun:

Main.aboutWindow.setJMenuBar(menubar); 
+0

Könnten Sie mir eine Beispielposition angeben? – sam4ritan

+0

Sie finden Details zum 'BorderLayout' Layout [HIER] (https://docs.oracle.com/javase/7/docs/api/java/awt/BorderLayout.html) – Titus

+0

Vielen Dank, das wird Ihnen helfen – sam4ritan