2017-12-19 3 views
0

Ich versuche ein JMenu mit einem MenuListener zu erstellen, um zu beenden, wenn ausgewählt, aber das Programm wird nicht beendet.MenuListener funktioniert nicht

Der Compiler zeigt keine Fehlermeldung an. Nicht sicher, ob es die e.getsource() nicht funktioniert oder wenn es etwas anderes ist.

Vielen Dank im Voraus.

import java.awt.*; 


import javax.swing.*; 
import javax.swing.event.MenuEvent; 
import javax.swing.event.MenuListener; 

public class entree implements MenuListener{ 
    JFrame frame; 
    JMenu exit,teach; 
    entree(){ 
     Font font=new Font("SansSerif",Font.BOLD,22); 
     JFrame frame=new JFrame(); 
     ImageIcon icon=new ImageIcon("D:\\Capture_aurora.png"); 
     JLabel bg=new JLabel(icon); 
     JMenuBar mb=new JMenuBar(); 

     JMenu teach=new JMenu("Teach"); 
     JMenu exit =new JMenu("Exit"); 
     teach.setFont(font);exit.setFont(font);exit.addMenuListener(this);teach.addMenuListener(this); 

     mb.add(teach);mb.add(Box.createHorizontalGlue());mb.add(exit); 


     JButton button1=new JButton("Start"); 
     button1.setFont(font); 
     button1.setBounds(870,820,150,45); 

     frame.setJMenuBar(mb); 
     frame.add(button1); 
     frame.add(bg,BorderLayout.CENTER); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setUndecorated(true); 


     frame.setVisible(true); 

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

    public void menuSelected(MenuEvent e) { 
     if(e.getSource()==exit) { 
     System.exit(0);frame.dispose();}// Code supposed to work here, but the program won't exit 
     if(e.getSource()==teach) {} 
     } 

    public void menuDeselected(MenuEvent e) { 

    } 
    public void menuCanceled(MenuEvent e) { 

    } 

    } 
+0

sollten diese Listener nicht zu MenuItems hinzugefügt werden, anstatt zum Menü selbst? – Stultuske

+0

Ich denke, ich brauche nur ActionListener für MenuItems und es funktioniert gut, ActionListener kann nicht in JMenus implementiert werden, deshalb verwende ich MenuListener. – Spots

+0

nicht. Sie sollten Listener nicht zum Menü, sondern zu den Menüelementen hinzufügen. Das Menü ist nicht das "anklickbare" Element, das Sie möchten, das MenuItem ist – Stultuske

Antwort

2

Antwort auf die Frage

Sie Ihre Variablen Shadowing ...

public class entree implements MenuListener { 

    JFrame frame; 
    JMenu exit, teach; 

    entree() { 
     //... 
     JMenu teach = new JMenu("Teach"); 
     JMenu exit = new JMenu("Exit"); 

Sie lokale Variablen im Konstruktor mit denselben Namen sind zu schaffen, wie die Instanz Felder Sie sind versuchen, später zu vergleichen. Das bedeutet, dass und teach tatsächlich null sind, wenn Sie versuchen, sie im Ereignishandler menuSelected zu vergleichen.

Vorschläge ...

Allgemeinen das ist wirklich nicht, wie JMenu s zur Arbeit annehmen, sie sind nicht dazu gedacht, „verwertbare“ Elemente zu sein, sollen sie Behälter für gleiche Gegenstände sein (implementiert als JMenuItem s).

Ich würde entweder ein JToolBar oder JPanel mit JButton s verwendet, die stattdessen auf die NORTH Position eines BorderLayout hinzugefügt wird. Aus der Sicht des Benutzers würde dies zu einer häufigeren und zu erwartenden Benutzererfahrung führen - IMHO