# JMenuItem enable / disable



## chrissy (22. Mai 2007)

Hallo,

ich glaube ich habe einen Denkfehler ... Ich möchte zur Laufzeit bestimmte Einträge in meinem JMenu aktivieren / deaktivien, abhängig von bestimmten Parametern.

```
this.setJMenuBar( createMenu());

private JMenuBar createMenu()
  {
    JMenuBar menu = new JMenuBar();
    JMenu mnuFile = new JMenu();
    JMenuItem mnuNew = new JMenuItem();
    JMenuItem mnuOpen = new JMenuItem();
    JMenuItem mnuSave = new JMenuItem();
    JMenuItem mnuSaveAs = new JMenuItem();
    JMenuItem mnuExit = new JMenuItem();
    JMenu mnuHelp = new JMenu();
    JMenuItem mnuInfo = new JMenuItem();
    JMenu mnuProd = new JMenu();
    JMenu mnuExport = new JMenu();
    JMenuItem mnuExPDF = new JMenuItem();
     
    mnuFile.setText(langPack.getString("File"));
    System.out.println(mnuFile.isShowing());
    mnuNew.setText(langPack.getString("New"));
    mnuNew.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent ae)
        {
          newFile();
        }
      });
    mnuFile.add(mnuNew);
    mnuOpen.setText(langPack.getString("Open"));
    mnuOpen.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent ae)
        {
          openFile();
        }
      });
    mnuFile.add(mnuOpen);
    mnuFile.addSeparator();
    mnuSave.setText(langPack.getString("Save"));
    mnuSave.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent ae)
        {
          setFileName();
          if (fileName.length() != 0) saveFile();
          else saveAsFile();
        }
      });
    mnuFile.add(mnuSave);
    mnuSaveAs.setText(langPack.getString("SaveAs"));
    mnuSaveAs.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent ae)
        {
          saveAsFile();
        }
      });
    mnuFile.add(mnuSaveAs);
    mnuFile.addSeparator();
    mnuExport.setText(langPack.getString("export"));
    //mnuExport.setEnabled(false);
    mnuFile.add(mnuExport);
    mnuExPDF.setText("PDF");
    mnuExPDF.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent ae)
      {
        print();
      }
    });
    mnuExport.add(mnuExPDF);
    mnuFile.addSeparator();
    mnuExit.setText(langPack.getString("Exit"));
    mnuExit.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent ae)
        {
          System.exit(0);
        }
      });
    mnuFile.add(mnuExit);
    menu.add(mnuFile);
    
    ButtonGroup groupProduct = new ButtonGroup();
    mnuAll.setText(langPack.getString("SelectAll"));
    mnuAll.setSelected(true);
    groupProduct.add(mnuAll);
    mnuAll.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent ae)
      {
        setSelectedProduct(true);
      }
    });
    mnuSingle.setText(langPack.getString("SelectSingle"));
    groupProduct.add(mnuSingle);
    mnuSingle.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent ae)
      {
        setSelectedProduct(false);
      }
    });
    mnuProd.setText(langPack.getString("Material"));
    mnuProd.add(mnuAll);
    mnuProd.add(mnuSingle);
    menu.add(mnuProd);
    
    mnuHelp.setText(langPack.getString("Help"));
    mnuInfo.setText(langPack.getString("About"));
    mnuInfo.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
          JOptionPane.showMessageDialog(desktop, 
                                        langPack.getString("Info"), "Info", 
                                        JOptionPane.INFORMATION_MESSAGE);
        }
      });
    mnuHelp.add(mnuInfo);
    menu.add(mnuHelp);
    
    return menu;
  }
```

Ich weiß, daß man mit JMenuItem.setEnable(true / false) ein element aktivieren / deaktivien kann, aber das ist dann ja einmalig beim Erstellen der Menubar. Ich würde gerne bei jedem Klick auf mnuFile eine Überprüfung ausführen und dem entsprechend den Eintrag mnuExport (de-)aktivieren.

Danke 
chrissy


----------



## The_S (22. Mai 2007)

dann lager deine MenuItems halt aus, so dass du immer wenn du sie brauchst darauf zugreifen kannst ???:L


----------



## chrissy (22. Mai 2007)

Hallo Hobbit,

es lag mir in den Fingerspitzen ... jetzt läufts.

Danke
chrissy


----------



## seekingone (23. Jan 2008)

Wie geht "Auslagern" ?

Ich habe einen Frame auf den dynamisch (abhängig von gewählten Buttons) verschieden jPanel eingebunden werden.
In diesem Frame habe ich auch eine jMenuBar eingebunden.
Nun wollte ich über Item.setEnable(boolen) je nachdem wer ein jPanel aufruft MenuItems aktivieren und deaktivieren.

Dafür wollte ich über den Konstruktor des einzubinden Panel eine Meethode im Frame aufrufen welches das Menü neu zeichnet. Das Menu ist zwa zu sehen, aber vollkommen ohne Funktion.

Auszug aus meinem Hauptfenster-Frame

```
public class Fenster extends JFrame {
    
    public static Fenster currentFrame;
    
    public static boolean modus = false;
    
    Container Ccontent;
    JPanel backpanel, tp;
    
    private javax.swing.JMenu jMenuModust;
    private javax.swing.JMenuItem jMenuModusItemSwitch;
 
    public Fenster() {
        super("FensterName");
        Fenster.currentFrame = this;
        initComponents();
    }

    private void initComponents() {
        create_mbar();
        }

    
    public void create_a_Panel(JPanel tp) {
        //zeichnet die entsprechenden jPanel
    }

    public void recreate_mbar(){
        jMenuBar1.removeAll();
        create_mbar();
        jMenuBar1.repaint();
        jMenuBar1.validate();
    }

    public void create_mbar() {
        //jMenuModus
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenuModus.setText("Modus");
        jMenuModusItemSwitch.setText("Admin/Benutzer");
        if(!modus){
            jMenuModusItemSwitch.setEnabled(false);
        }
        jMenuModusItemSwitch.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuModusItemSwitchActionPerformed(evt);
            }
        });
        jMenuModus.add(jMenuModusItemSwitch);         
        jMenuBar1.add(jMenuModus);     
        setJMenuBar(jMenuBar1);
    }
//MAIN
    public static void main(String args[]) { 
        Fenster frame = new Fenster();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
```

Hoffe es ist nicht all zu unübersichlich. EventHandler Methoden habe ich raus gelassen. Sollte eine Variable nicht deklariert sein, ist das beim "Reinigen" passiert.


----------



## The_S (24. Jan 2008)

Wo setzt du denn modus wieder auf true?


----------



## seekingone (24. Jan 2008)

Fenster.currentFrame.modus = true;
bzw.
Fenster.currentFrame.modus = false;

Wird vor dem Einbinden des neuen jPanel gesetzt, danach rufe "ich" im Konstructor des neuen jPanel die Methode recreate_mbar() auf.

z.B.: aus Methode jButton42ActionPerformed()

```
jPanelNumber42 neuesPanel = jPanelNumber42();
Fenster.currentFrame.modus = true;
Fenster.currentFrame.create_a_Panel(neuesPanel);
```

jPanelNumber42 Konstruktor

```
public jPanelNumber42() {
    Fenster.currentFrame.recreate_mbar();
    initComponentes();
}
```


----------



## The_S (24. Jan 2008)

Und wie kommt Fenster in jPanelNumber42? Du solltest dir zuerst einmal ein ordentliches Klassendesign überlegen.

Lass mal bei jedem Durchlauf von create_mbar dir die Variable modus ausgeben. Wenn sie jedesmal auf false steht, dann setzt du die Variable falsch.


----------



## seekingone (24. Jan 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Und wie kommt Fenster in jPanelNumber42? Du solltest dir zuerst einmal ein ordentliches Klassendesign überlegen.



jPanelNumber42 (Panel) kommt in Fenster (Frame). [geht das anderst herum?]

Fenster ist ein statischer Frame

```
public class Fenster extends JFrame {
//...   
    public static Fenster currentFrame; // < 
//...
    public Fenster() {
        super("FensterName");
        Fenster.currentFrame = this; //<
        initComponents();
    }
//...
```

Sobald ich die Methode recreate_mbar aufrufe, kann man die Menüleiste zwar sehen, alle Einträge vom Typ jMenu sind aber funktionslos > es geht kein DropDown Menü mehr auf > es werden keine JMenuItem mehr angezeigt.

Wäre die Variable modus einfach immer nur false, sollte doch wenigstens der Rest von meiner Menüleiste noch funktionieren oder?


----------



## The_S (24. Jan 2008)

poste doch mal ein kleines KSKB, welches dein Problem uns nachvollziehen lässt. Also eine Klasse mit ner main-Methode, die man ausführen kann, und genau dein Problem simuliert.


----------

