JMenuBar wiederverwenden und Eventhandling anpassen

strußi

Top Contributor
Hey Leute,

bin gerade dabei meine Menubar auszulagern, dabei ist mir aufgefallen, dass ich das so nicht stehen lassen kann, weil auch das handling angepasst werden muss, je nach klasse, die es aufruft, bzw. in einzelnen klassen Methoden liegen die aufgerufen werden sollen.

Java:
package gui;

import gui.messwerte.StandardGUI;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Christian
 */
public class Menubar implements ActionListener{

    // Variablen für die Sichtbarkeit
    private boolean progStartB =true;
    private boolean progSaveB =true;
    private boolean progOpenB =true;
    private boolean auswMenuB =true;
    
    
    //M E N Ü
    //Menüpunkte für Programmstart
    JMenuItem progStart, progOpen, progSave, progNull, progExit;
    //Menüpunkte für die Dateneingabe
    JMenuItem dateneingabeItem;    
    //Menüpunkte für die Auswertung
    JMenuItem  ausw, auswPerlschnur, auswHorizont, auswGrafik;   
    //Menüpunkte für Hilfefunktion
    JMenuItem hilfe, hilfeVersion, hilfeEinlesen;
    
    
    /**
     * Methode zum erstellen der Menüs
     * Erstellen der Menüpunkte und 
     * Initialisierung der Menüunterpunkte mit Name sowie Einbindung in den ActionListener
     * 
     * @return 
     */
    public JMenuBar menu(){
        JMenuBar bar =new JMenuBar(); //Menüleiste auf die alle Menüpunkte kommen
        JMenu programmMenu =new JMenu( "Programm"); //Menü "Programm" erstellen
            programmMenu.setMnemonic( 'P'); //Ansprechen des Menüpunktes über Alt+ Markierte Buchstabe
        Icon iHome =new ImageIcon( "icon\\home.gif"); //Icon für den Menüpunkt erstellen
        progStart =new JMenuItem( "Startbildschirm", iHome); //Menüpunkt erstellen
            progStart.addActionListener( this); //Menüpunkt im ActionListener anmelden
            programmMenu.add( progStart); //Menüpunkt im Menü anmelden
            progStart.setAccelerator( // Funktionalität Strg +Buchstabe nach drücken Alt+ Menü
                KeyStroke.getKeyStroke( 'H', InputEvent.CTRL_DOWN_MASK )
              );
            progStart.setEnabled( progStartB);
        Icon iSave =new ImageIcon( "icon\\save_16.png"); //Icon für den Menüpunkt erstellen
        progSave =new JMenuItem( "Speichern", iSave); //Menüpunkt erstellen
            progSave.addActionListener( this); //Menüpunkt im ActionListener anmelden
            programmMenu.add( progSave); //Menüpunkt im Menü anmelden
            progSave.setAccelerator( // Funktionalität Strg +Buchstabe nach drücken Alt+ Menü
                KeyStroke.getKeyStroke( 'S', InputEvent.CTRL_DOWN_MASK )
              );
            progSave.setEnabled( progSaveB);
        Icon iOpen =new ImageIcon( "icon\\open_16.gif"); //Icon für den Menüpunkt erstellen
        progOpen =new JMenuItem( "Öffnen", iOpen); //Menüpunkt erstellen
            progOpen.addActionListener( this); //Menüpunkt im ActionListener anmelden
            programmMenu.add( progOpen); //Menüpunkt im Menü anmelden
            progOpen.setAccelerator( // Funktionalität Strg +Buchstabe nach drücken Alt+ Menü
                KeyStroke.getKeyStroke( 'O', InputEvent.CTRL_DOWN_MASK )
              );
            progOpen.setEnabled( progOpenB);
        programmMenu.addSeparator();
        Icon iClose =new ImageIcon( "icon\\exit_20.png"); //Icon für den Menüpunkt erstellen
        progExit =new JMenuItem( "Werteeingabe Beenden", iClose); //Menüpunkt erstellen
            progExit.addActionListener( this); //Menüpunkt im ActionListener anmelden
            programmMenu.add( progExit); //Menüpunkt im Menü anmelden
            
        JMenu datInMenu =new JMenu( "Dateneingabe"); // Menü "Dateneingabe" erstellen
        datInMenu.setMnemonic( 'D');
        dateneingabeItem =new JMenuItem( "Messwerte eingeben"); //Menüpunkt erstellen
            dateneingabeItem.addActionListener( this); //Menüpunkt im ActionListener anmelden
            datInMenu.add( dateneingabeItem); //Menüpunkt im Menü anmelden
        
        JMenu auswMenu =new JMenu( "Auswertung"); //Menü "Auswertung" erstellen
        auswMenu.setMnemonic( 'A'); //Ansprechen des Menüpunktes über Alt+ Markierte Buchstabe
            auswMenu.setEnabled( auswMenuB);
        ausw =new JMenuItem( "Auswertung"); //Menüpunkt erstellen
            ausw.addActionListener( this); //Menüpunkt im ActionListener anmelden
            auswMenu.add( ausw); //Menüpunkt im Menü anmelden
        auswPerlschnur =new JMenuItem( "Perlschnurverfahren"); //Menüpunkt erstellen
            auswPerlschnur.addActionListener( this); //Menüpunkt im ActionListener anmelden
            auswMenu.add( auswPerlschnur); //Menüpunkt im Menü anmelden
        auswHorizont =new JMenuItem( "Horizontenverfahren"); //Menüpunkt erstellen
            auswHorizont.addActionListener( this); //Menüpunkt im ActionListener anmelden
            auswMenu.add( auswHorizont); //Menüpunkt im Menü anmelden
        auswMenu.addSeparator(); //Mehtode zum einfügen einer Trennlinie
        auswGrafik =new JMenuItem( "Grafische Auswertung"); //Menüpunkt erstellen
            auswGrafik.addActionListener( this); //Menüpunkt im ActionListener anmelden
            auswMenu.add( auswGrafik); //Menüpunkt im Menü anmelden
        
        JMenu hilfeMenu =new JMenu( "Hilfe"); //Hilfemenü
        hilfeMenu.setMnemonic( 'H'); //Ansprechen des Menüpunktes über Alt+ Markierte Buchstabe
        Icon iHelp =new ImageIcon( "icon\\Help.png");
        hilfe =new JMenuItem( "Hilfe", iHelp);
            hilfe.addActionListener( this);
            hilfeMenu.add( hilfe);
        Icon iInfo =new ImageIcon( "icon\\info_16.png"); //Icon für den Menüpunkt erstellen
        hilfeVersion =new JMenuItem( "Versionsinfo", iInfo);
            hilfeVersion.addActionListener( this);
            hilfeMenu.add( hilfeVersion);
        hilfeEinlesen =new JMenuItem( "Einlese-Info", iInfo);
            hilfeEinlesen.addActionListener( this);
            hilfeMenu.add( hilfeEinlesen);
            
        bar.add( programmMenu); //Der Menüleiste das Menü "Programm" hinzufügen
        bar.add( datInMenu); //Der Menüleiste das Menü "Dateneingabe" hinzufügen
        bar.add( auswMenu); //Der Menüleiste das Menü "Auswertung" hinzufügen
        bar.add( hilfeMenu); //Hinzufügen eines Hilfemenüs
        return bar;
    }
    
    /**
     * Methode für die Bestimmtung, welche Menüpunkte/-items angezeigt werden.
     * @param progStartB
     * @param progSaveB
     * @param progOpenB
     * @param auswB 
     */
    public void setMenuesVisible( boolean progStartB, boolean progSaveB, boolean progOpenB, boolean auswB){
        this.progStartB =progStartB;
        this.progSaveB =progSaveB;
        this.progOpenB =progOpenB;
        this.auswMenuB =auswB;
    }
    
    
    @Override
    public void actionPerformed( ActionEvent e){
        if( e.getSource() ==progStart){ //Startbildschirm - Disable
        } else if( e.getSource() ==progOpen){ //Öffnen
        } else if( e.getSource() ==progSave){ //Speichern - Disable
        } else if( e.getSource() ==progExit){ //Beenden
        } else if( e.getSource() ==dateneingabeItem){ //Dateneingabemaske start
            StandardGUI sg =new StandardGUI();
            sg.start();
        } else if( e.getSource() ==ausw){
        } else if( e.getSource() ==auswPerlschnur){ //Berechnung mittels Perlschnurverfahren
        } else if( e.getSource() ==auswHorizont){ //Berechnung mittels Horizontenverfahren
        } else if( e.getSource() ==auswGrafik){ //Grafischeauswertung
        } else if( e.getSource() ==hilfe){ //Größe Hilfe
        } else if( e.getSource() ==hilfeVersion){ //Versionsinformationen
        } else if( e.getSource() ==hilfeEinlesen){ //Hilfe für das Einlesen von Textdateien
        } else{}
    }

}

Jetzt die frage, wie lös ich den Actionteil aus, bzw. übergebe einzelne mehtodenaufrufe, damit es noch mehr OO ist. :bahnhof:

Einer meiner Dozenten hätte gesagt, der Programmierstil, sofern vorhanden wäre pathologisch.

Danke für euere Antworten und Grüße
Chris
 
Kannst du bitte ein codingbeispiel posten?

ich dreh bei soviel text durch, und ganz klar ist es mit auch nicht geworden.

Grüße
Chris
 
Ich versuch mal es dir vom Handy aus zu erläutern,

Du hast ein JMenu, diesem sind Elemente zugeordnet, die JMenuItem, man kann jetzt hergehen und allen items einen listener zuweisen, oder man definiert für jedes Item eine eigene Action, so ds diese Actions z.b in einer toolbar ebenfalls verwendet werden können.

Dies könnte so aussehen:

Java:
public class CloseAction extends AbstractAction {

  JFrame frame;

public CloseAction (JFrame frame){
  super ("Schließen");
  this.frame = frame;
}

@Override
public void actionPerformed(ActionEvent event){
 this.frame.dispose ();
}
}

Wenn du jetzt diese Action deinem JMenuItem zuweist

Java:
JMenuItem close = JMenuItem(new CloseAction (frame));

Agiert diese Action mit der von dir definierten Aktion, das Fenster ( in diesen Fall über die Referenz frame angesprochene)wird abgebaut / geschlossen.

Diese Lösung lässt sich überall dort sinnvoll einsetzen wo du ggf. Mehrere Buttons für gleiche Aktionen hast, eben Menu und toolbar z.b
 
Danke kaoZ,

hat mir leider nicht weiter geholfen. Steh da aufm wlan-kabel :bloed:
Ich schau mal ob ich eine andere Lösung finde

grüße
Chris
 

Zurück
Oben