menueintrag aktivieren



  • hallo
    ist eigentlich keine schwere sache aber ich kriegs einfach nicht hin. ich habe eine menu mit bei dem man verschiedene levels auswählen kann. am anfang sollte man jedoch nur level1 auswählen können. erst wenn man level1 geschaft hat soll man level2 auswählen können, usw.

    jetzt ist es so das ich während der lauft zeit den status des menu einträges nicht mehr änderen kann. was mach ich falsch????????????????'''

    [java]public class GameMenu extends JMenuBar implements ActionListener {

    private JMenu m_oJMenuDatei;
    private JMenu m_oJSubMenu;

    private boolean m_bIsLevelreached;

    private JMenu createMenu(){

    JMenuItem oJMenuItem;
    JMenu ret = new JMenu("Level's");
    ret.setMnemonic('L');

    oJMenuItem = new JMenuItem("Level1");
    oJMenuItem.addActionListener(this);
    oJMenuItem.setActionCommand("Level1");
    oJMenuItem.setEnabled(true);
    ret.add( oJMenuItem );

    oJMenuItem = new JMenuItem("Level2");
    oJMenuItem.addActionListener(this);
    oJMenuItem.setActionCommand("Level2");
    oJMenuItem.setEnabled(islevelreached);
    oJMenuItem.setMnemonic('1');
    ret.add( oJMenuItem );[/code]

    sobald das level1 erreicht wurde wird die variable islevelreached gesetzt aber leider reagiert der menupunkt nicht darauf

    Edit: Code-Tags sind schön ...

    [ Dieser Beitrag wurde am 26.05.2003 um 10:48 Uhr von CengizS editiert. ]



  • Nur weil du die Variable änderst wird nicht auch gleich automatisch der Status des Menüeintrags mitgeändert. Also nachdem du die Variable islevelreached auf true gesetzt hast einfach nochmal oJMenuItem.setEnabled(islevelreached); aufrufen.



  • ja aber da hab ich ein problem da ich die variable levelreached in einer anderen klasse setze von der aus ich kein zugriff auf oJMenuItem habe.



  • du mußt eben ein bißchen mit den referenzen jonglieren.. des heißt überall wo du zugriff auf was brauchst, schickst du ne referenz zu nem Objekt hin

    hier mal n kleines Beispiel:

    [java]class LevelManager //Klasse mit LevelReached
    {
    JFrame frame;

    public LevelManager(JFrame frame) //Konstruktor wird Referenz übergeben
    {
    this.frame = frame;
    }
    ..blabla
    public void levelGeschafft()
    {
    machIrgendwas();
    frame.enableLevel(x); //Level im MainMenu freischalten
    }
    }

    class Win extends JFrame//Klasse mit Main Menu
    {
    public Win()
    {
    super("super");
    new LevelManager(this); //verbindung zwischen Win und LevelManager herstellen
    }
    public void enableLevel(int lev)
    {
    //Menu - Item enablen
    }
    }[/code]

    [ Dieser Beitrag wurde am 26.05.2003 um 10:04 Uhr von crass editiert. ]

    [ Dieser Beitrag wurde am 26.05.2003 um 10:48 Uhr von CengizS editiert. ]



  • ja aber das nächste problem ist, wenn ich 10 menueinträge habe dann muss ich auch 10 objekte (was nicht so toll aussieht) davon haben und zwar als member. momentan verwende ich für die initialisierung der einzelenen menueinträge das gleiche lokale objekt. somit kann ich nachher nicht mehr direkt auf die einträge zugreifen. (ausser im actionperfomed mit e.getSource).

    eine alterntive (sehr aufwendige) möglichkeit wäre die verwendung eines mediators.



  • du mußt ja nicht 10 Referenzen rumschieben.. du kannst ja alle in einen Vektor tun zB und dann nur den Vektor an alle interessierten Objekte weitergeben..



  • Wofür denn 10 Objekte? Mach das gante doch einfach dynamisch und sepichere alle Objekte, die enabled werden können in einem Array (oder einer Liste). Dann kannst du dann mit einer for-Schleife beliebig viele enablen...

    private JMenuItem[] items = new JMenuItem[10];
    [...]
    //Immer wenn du einen neuen Menüeintrag machst, dann schreibst du das Objekt in den Array:
    int i = 0;
    [...]
    items[i++] = oJMenuItem;
    
    //Hier kannst du nun eine Mehtode machen, die alles erledigt:
    public void enableLevel(int level)
    {
      int i = 0;
      for ( ; i<level; i++) {
        items[i].setEnabled(true);
      }
      for ( ; i<items.length; i++) {
        items[i].setEnabled(false);
      }
    }
    

    So kannst du sogar wenn zuerst schonmal Level 9 freigeschaltet qwar wieder bis auf 0 zurückgehen.


Anmelden zum Antworten