JMenuItem enable / disable

Status
Nicht offen für weitere Antworten.

chrissy

Bekanntes Mitglied
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.
Code:
 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

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

seekingone

Mitglied
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
Code:
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.
 

seekingone

Mitglied
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()
Code:
jPanelNumber42 neuesPanel = jPanelNumber42();
Fenster.currentFrame.modus = true;
Fenster.currentFrame.create_a_Panel(neuesPanel);

jPanelNumber42 Konstruktor
Code:
public jPanelNumber42() {
    Fenster.currentFrame.recreate_mbar();
    initComponentes();
}
 

The_S

Top Contributor
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

Mitglied
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
Code:
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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JList als JMenuItem Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben