ActionListener in MVC

Sin137

Mitglied
Hallo liebe Community,

ich bin gerade dabei mich etwas an MVC auszuprobieren.
Ich habe nun eine View-Klasse, die ein menü erstellen soll

Java:
package de.jonathan_puxler.view;

import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

import de.jonathan_puxler.controller.MenuController;
import de.jonathan_puxler.model.MenuModel;

@SuppressWarnings("serial")
public class MenuView extends JMenuBar implements Observer{

    private MenuController _controller;
    private MenuModel _model;
   
    private JMenuItem menuItem;
    private JMenu menu, submenu;
    private Color bb = new Color(4,96,173);
   
    public MenuView(){
        _controller = new MenuController(this);
       
        menuItem = new JMenuItem();
        menu = new JMenu();
        this.setBackground(bb);
        this.setForeground(Color.white);
        createFileMenu();
    }
   
    public void createFileMenu(){
        menu = new JMenu("Datei");
        menu.setMnemonic(KeyEvent.VK_D);
        menu.setForeground(Color.white);
       
        //Neue Abfrage erstellen
        submenu = new JMenu("Neue Abfrage");
        submenu.setMnemonic(KeyEvent.VK_N);
        submenu.setForeground(bb);
        submenu.setActionCommand("Neue Abfrage");
        _controller.controllSubmenu();
        menu.add(submenu);
       
        menuItem = new JMenuItem("Beispiel");
        menuItem.setForeground(bb);
        menuItem.setActionCommand("Beispiel");
        _controller.controllMenuItem(menuItem);
        submenu.add(menuItem);
       
        menuItem = new JMenuItem("Aus Kategorie auswählen");
        menuItem.setForeground(bb);
        menuItem.setActionCommand("Aus Kategorie auswählen");
        _controller.controllMenuItem(menuItem);
        submenu.add(menuItem);
       

        //Abgespeicherte Abfrage öffnen
        menuItem = new JMenuItem("Abfrage öffnen");
        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        menuItem.setForeground(bb);
        _controller.controllMenuItem(menuItem);
               
       
        //Programm Beenden
        menuItem = new JMenuItem("Beenden");
        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        menuItem.setForeground(bb);
        menuItem.setBackground(Color.red);
        menu.add(menuItem);
        _controller.controllMenuItem(menuItem);
   
   
        menu.add(menuItem);
        add(menu);
    }
   
    public Color getColor(){
        return bb;
    }
   
    public JMenu getSubmenu(){
        return submenu;
    }
   
    public JMenu getMenu(){
        return menu;
    }
   
    public JMenuItem getMenuItem(){
        return menuItem;
    }

    @Override
    public void update(Observable arg0, Object arg1) {
        // TODO Auto-generated method stub
       
    }
   
   
   
   
   
   
}

und eine Controller-Klasse wo meines Wissens die Listener enthalten sind.

Java:
package de.jonathan_puxler.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JMenu;
import javax.swing.JMenuItem;

import org.omg.Messaging.SyncScopeHelper;

import de.jonathan_puxler.model.MenuModel;
import de.jonathan_puxler.view.MenuView;

public class MenuController implements Observer{
   
    private MenuView _view;
    private MenuModel _model;
       
    public MenuController(MenuView _view){
        this._view = _view;
       
    }
   
    public void controllMenu(JMenu menu){
    }
   
    public void controllSubmenu(){
       
        _view.getSubmenu().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String actionCommand = ((JMenu)e.getSource()).getActionCommand();
                System.out.println("Testausgabe Zeile: 35");
                if(actionCommand.equals("Neue Abfrage")){
                }
               
            }
        });
    }
   
   
    public void controllMenuItem(JMenuItem menuItem){
               
    }
       
    @Override
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
       
    }
   
   
}

angezeigt wird mir alles genau, nur wenn ich jetzt auf mein submenü drücke kommt nicht die gewünschte ausgabe. Sprich es funktioniert leider nicht.


Ideen oder Vorschläge zur Fehlerlösung?
Oder ist der Ansatz falsch die Listener in die Controllerklassen zu stecken?



Mit freundlichen Grüßen

Sin
 
angezeigt wird mir alles genau, nur wenn ich jetzt auf mein submenü drücke kommt nicht die gewünschte ausgabe. Sprich es funktioniert leider nicht.

Ohne mir den Code angeschaut zu haben: Welche Ausgabe erwartest du? Welche Ausgabe bekommst du?

"Funktioniert nicht" als Fehlerbeschreibung beim Programmieren leider nicht sehr hilfreich. Normalerweise passieren Fehler und es wird eine Exception geschmissen (Fehlermeldung + StackTrace) oder das Programm verhält sich falsch dann sollte man natürlich auch beschreiben was sich falsch verhält 😉
 
Also Fehlermeldung bekomme ich nicht, da alles läuft.
Das was nicht ausgegeben wird ist das was in dem Controller steht:
System.out.println("Testausgabe Zeile: 35");
So wie es ausschaut wird der ActionListener nicht richtig registriert.
Denke ich übersehe was oder bin mit der oo grad durcheinander.
Ausgegeben wird ja nichts....
 
Hm sicher bin ich mir nicht, aber ich glaube es liegt ein Denkfehler vor:

Eine JMenu ist nur als Container gedacht für anderen JMenu Objekte und JMenuItems.
Man kann zwar einen ActionListener anhängen bin mir aber nicht sicher wie und ob das funktioniert!
Verwende doch lieber ein JMenuItem 🙂
 
Kann ich mit einem JMenuItem auch ein Untermenü erzeugen lassen?
Mein vorhaben:
Entweder draufdrücken und dann per Fenster auswählen o.
ins untermenü gehen und da schon ein schritt Spezifischer auswählen.


LG

Sin
 
Habe noch einmal rumprobiert.
Meine Vorgehensweiße mit einem JMenuItem funktioniert.
Liegt wohl dann wirklich daran, dass man kein JMenu mit einem ActionListener belegen "kann".
Submenu zum JMenuItem habe ich jetzt soweit nicht hinbekommen.
Wenn jemand weiß, wie dies funktioniert wäre ich ihm sehr dankbar.


LG

Sin
 

Zurück
Oben