Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Desktop-Applikationen und Grafik > MenuItem Action Listener automatisch erzeugen
Antwort
 
Themen-Optionen
Alt 22.02.2005, 17:52   Nach oben    #1
`B
Benutzer
 
Benutzerbild von `B
 
Registriert seit: 05.07.2004
Beiträge: 95
Standard MenuItem Action Listener automatisch erzeugen

Hi,

ich habe am Anfang folgenden CodeSchnipssel zu präsentieren:

Code:
 
/** Die Menuleiste. */
private MenuBar mb;
/** Die Menupunkte. */
private Menu datei, bearbeiten, filter, hilfe, spiegeln;
/** Die Menuunterpunte. */
private MenuItem beenden, fragez, laden, farbwertveraenderung,
skalieren, graustufen, weichzeichnen, horizontalSpiegeln,
vertikalSpiegeln, speichernUnter, speichern, kontrast;
/** Undo / Redo Menuunterpunte. */
private MenuItem undo, redo;
 
/**
* Menübar wird erzeugt mit jeweiligen Menü´s und Einträgen.
*/
private void erzeugeMenue() {
// Menüanzeige initialiseren
mb = new MenuBar();
// Menüs initialisieren
datei = new Menu(MENUTITEL_DATEI);
bearbeiten = new Menu(MENUTITEL_BEARBEITEN);
filter = new Menu(MENUTITEL_FILTER);
filter.setEnabled(FILTERMENU);
hilfe = new Menu(MENUTITEL_HILFE);
spiegeln = new Menu(MENU_FILTER_SPIEGELN);
spiegeln.setEnabled(SPIEGELNMENU);
// Menüeinträge initialisieren
laden = new MenuItem(MENU_OEFFNEN);
speichern = new MenuItem(MENU_SPEICHERN);
speichern.setEnabled(BOOL_SPEICHERMENU);
speichernUnter = new MenuItem(MENU_SPEICHERNUNTER);
speichernUnter.setEnabled(BOOL_SPEICHERUNTERMENU);
beenden = new MenuItem(MENU_BEENDEN);
undo = new MenuItem(MENU_UNDO);
undo.setEnabled(BOOL_UNDOMENU);
redo = new MenuItem(MENU_REDO);
redo.setEnabled(BOOL_REDOMENU);
farbwertveraenderung = new MenuItem(MENU_FILTER_FARBWERT);
skalieren = new MenuItem(MENU_FILTER_GROESSE);
graustufen = new MenuItem(MENU_FILTER_GRAUSTUFE);
kontrast = new MenuItem(MENU_FILTER_KONTRAST);
weichzeichnen = new MenuItem(MENU_FILTER_WEICHZEICHNEN);
horizontalSpiegeln = new MenuItem(MENU_FILTER_SPIEGEL_H);
vertikalSpiegeln = new MenuItem(MENU_FILTER_SPIEGEL_V);
fragez = new MenuItem(MENU_HILFE_FRAGEZ);
// Menüeinträge einfügen
datei.add(laden); // Datei->Datei öffnen...
datei.addSeparator(); // Datei->--------
datei.add(speichern); // Datei->Speichern
datei.add(speichernUnter); // Datei->Speichern unter...
datei.addSeparator(); // Datei->--------
datei.add(beenden); // Datei->Beenden
bearbeiten.add(undo);
bearbeiten.add(redo);
filter.add(farbwertveraenderung); // Filter->Farbwerte ändern...
filter.add(skalieren); // Filter->Größe ändern...
filter.add(graustufen); // Filter->Graustufenfilter
filter.add(weichzeichnen); // Filter->Weichzeichnen
filter.add(kontrast); // Filter->Kontrastriere
filter.add(spiegeln); // Filter->Spiegeln
spiegeln.add(vertikalSpiegeln); // Filter->Spiegeln->Horizontal
spiegeln.add(horizontalSpiegeln); // Filter->Spiegeln->Vertikal
hilfe.add(fragez); // Hilfe->?
// Menü(s) in Menübar einfügen
mb.add(datei);
mb.add(bearbeiten);
mb.add(filter);
mb.setHelpMenu(hilfe);
// Menübar in Frame einfügen
setMenuBar(mb);
laden.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Datei laden"); } });
speichern.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Datei speichern"); } });
speichernUnter.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Datei speichern unter"); } });
beenden.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Anwendungbeenden"); } });
undo.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Rueckgaengig"); } });
redo.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Wiederherstellen"); } });
farbwertveraenderung.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Farbwertveränderung"); } });
skalieren.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Skalieren"); } });
graustufen.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Graustufe"); } });
weichzeichnen.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Weichzeichnen"); } });
kontrast.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("Kontrast"); } });
vertikalSpiegeln.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("horizontales Spiegeln"); } });
horizontalSpiegeln.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener("vertikales Spiegeln"); } });
repaint();
}
Da dies viel zu unübersichtlich war habe ich das alles ein wenig verkürzt. Dadurch stellen sich aber nun neue Probleme.

Code:
final String[] KONST_MENUE_AUFSCHRIFTEN = new String[] {"Datei", "Bearbeiten", "Filter", "Hilfe"}; 
final String[] KONST_MENUE_EINTRAEGE = new String[] {
   "Laden...#-#Speicher#Speichern unter...#-#Beenden", 
   "R\u00fcckg\u00e4ngig#Wiederherstellen#-#Kopieren#Einfuegen#Ausschneiden",  "Farbwertver\u00e4nderung...#Skalieren...#Graustufen#Weichzeichnen#Horizontal spiegeln#Vertikal spiegeln#Kontrast",
"?"};
 
private void erzeugeMenue() {
// Menüanzeige initialiseren
mb = new MenuBar();
// Menüs initialisieren
liste = KONST_MENUE_AUFSCHRIFTEN;
for(int i=0; i<liste.length - 1; i++) {
	Menu eintrag		= new Menu(liste[i]);
	hilfsliste = KONST_MENUE_EINTRAEGE[i];
	liste2 = hilfsliste.split("#");
	for(int j=0; j<liste2.length -1; j++) {
		if(liste[j].equals("-")) {
		 eintrag.addSeparator();
		} else {
		 MenuItem menueEintrag = new MenuItem(liste[j]);
		 eintrag.add(menueEintrag);
		}
	}
	hatMenue[i] = eintrag;
}
this.fuegeActionListenerHinzu();
}


Nun stellt sich mir nur die Frage:

1. wie Spreche ich die MenuItems nun direkt an um sie enabled bzw. disabled setzen zu können.
2. wie kann ich sobald ich sie ansprechen kann diesen langen addActionListener Teil von oben verkürzen? Aufgerufen werden soll IMMER main.bearbeiteEreignis(KONST_EREIGNIS_***MenüEintr agName (zB.***LADEN).

Anmerkung noch zum Schluss alle Worte die nur in Großbuchstaben geschrieben sind, sind deklarierte Variablen aus einem Interface auf die zugegriffen werden können.
__________________
`B ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.02.2005, 19:06   Nach oben    #2
Erfahrener Benutzer
 
Benutzerbild von peschmae
 
Registriert seit: 29.05.2004
Beiträge: 228
Standard

Zitat:
Zitat von `B
1. wie Spreche ich die MenuItems nun direkt an um sie enabled bzw. disabled setzen zu können.
Da musst du dich wohl durch den Menübaum hangeln und bei jedem gucken ob das jetzt da ist - ausgehend von der MenuBar. Das tönt allerdings recht ineffizient. Eventuell ne Map für das Zeugs? Kommt halt drauf an ausgehend von welchen Daten (Name?) du den Menüpunkt jeweils finden willst.

Damit kannst du den Listener Teil doch auch recht effizient machen. Also einfach ne for Schleife die alle Menüs durchgeht und dort mit getItem() bis zu getItemCount() und immer mit dem aktuellen Eintrag ein

Code:
item.addActionListener(new ActionListener() {
public final void actionPerformed(final ActionEvent e) {
main.menuListener(item.getLabel()); } });
macht.

MfG peschmä
__________________
Amazon.de | The Java Trap | Freie Software | Freie Software vs. Open Source | GNU Classpath | GCJ | SableVM
"We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil." - Donald Knuth
peschmae ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.02.2005, 21:01   Nach oben    #3
`B
Benutzer
 
Benutzerbild von `B
 
Registriert seit: 05.07.2004
Beiträge: 95
Standard

habe nun ne Lösung für mein Problem, weiß net ob die so 100% fein ist aber ich poste sie gleich mal hier.

Also erstmal drei ewig lange Zeilen, die großen Wörter darin sind wieder finals die zuvor deklariert wurden.

PHP-Code:
 // Menueerzeugung
    
final String[] KONST_MENUE_AUFSCHRIFTEN       = new String[]   {"Datei""Bearbeiten""Filter""Hilfe"};
    final 
String[][] KONST_MENUE_EINTRAEGE        = new String[][] { {"Laden...""-""Speicher""Speichern unter...""-""Beenden"},
                                                                     {
"R\u00fcckg\u00e4ngig""Wiederherstellen""-""Kopieren""Einfuegen""Ausschneiden"},
                                                                     {
"Farbwertver\u00e4nderung...""Skalieren...""Graustufen""Weichzeichnen""Horizontal spiegeln""Vertikal spiegeln""Kontrast"},
                                                                     {
"?"} };
    final 
int[][] KONST_MENUE_EINTRAG_EREIGNIS      = new int[][] { {KONST_EREIGNIS_LADE0KONST_EREIGNIS_SPEICHERNKONST_EREIGNIS_SPEICHERN_UNTER0KONST_EREIGNIS_BEENDEN},
                                                                    {
KONST_EREIGNIS_RUECKGAENGIGKONST_EREIGNIS_WIEDERHERSTELLEN0KONST_EREIGNIS_KOPIERENKONST_EREIGNIS_EINFUEGENKONST_EREIGNIS_AUSSCHNEIDEN},
                                                                    {
KONST_FILTEREREIGNIS_FARBWERTKONST_FILTEREREIGNIS_SKALIERENKONST_FILTEREREIGNIS_GRAUSTUFEKONST_FILTEREREIGNIS_WEICHZKONST_FILTEREREIGNIS_H_SPIEGELKONST_FILTEREREIGNIS_V_SPIEGELKONST_FILTEREREIGNIS_KONTRAST},
                                                                    {
KONST_EREIGNIS_HILFE} }; 
So das war die Vorraussetzung für folgende Funktion:

PHP-Code:
private void erzeugeMenue() {
    
// Menüleiste initialiseren
    
mb = new MenuBar();
    
// Menüs initialisieren
    
final String[]    kenntMenuePunkte     KONST_MENUE_AUFSCHRIFTEN;
    final 
String[][] kenntMenueEintraege KONST_MENUE_EINTRAEGE;
    final 
int[][]     kenntMenueEreignisse KONST_MENUE_EINTRAG_EREIGNIS;
    for(
int i=0i<kenntMenuePunkte.length 1i++) {
        
Menu hatMenuePunkt = new Menu(kenntMenuePunkte[i]);
        
// Menüunterpunkte hinzufügen
        
for(int j=0j<kenntMenueEintraege[i].length -1j++) {
            
// Abfrage ob Eintrag nur ein Separator sein soll
            
if(kenntMenueEintraege[i][j].equals("-")) {
                
hatMenuePunkt.addSeparator();
            } else { 
                
// MenuItem erzeugen
                
MenuItem hatMenueEintrag = new MenuItem(kenntMenueEintraege[i][j]);
                
// MenuItem dem Menu hinzufügen
                
hatMenuePunkt.add(hatMenueEintrag);
                
// Action Listener hinzufügen
                
final int a i; final int b j;
                
hatMenueEintrag.addActionListener(new ActionListener() {
                        public final 
void actionPerformed(final ActionEvent e) {
                        
kenntEB.bearbeiteEreignis(kenntMenueEreignisse[a][b]); } });
            }
        }
        
// Fertiges Menü der Menüleiste hinzufügen
        
mb.add(hatMenuePunkt);
    }

Hab nun php-Tag genommen zum eintrücken. Wüßte gerne noch wie die zeile
final int a = i; final int b = j;
unüberflüssig machbar ist.
`B ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.02.2005, 18:29   Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Heiliger Joseph...

Les mal im Java-Tutorial das Kapitel über Actions durch. Das ist ziehmlich genau das, was du da beschreibst.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.02.2005, 10:41   Nach oben    #5
`B
Benutzer
 
Benutzerbild von `B
 
Registriert seit: 05.07.2004
Beiträge: 95
Standard

hm nu hab ich das ja so gemacht aber die MB wird mir nicht angezeigt ... woran liegt das?

Ich poste hier mal den gesammten Quelltxt der entsprechenden Klasse:

PHP-Code:
import java.awt.Frame;
import java.awt.MenuBar;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
/**
  * Diese Klasse dient dazu um die eigentliche GUI zu erzeugen und deren
  * Objekte zu erzeugen.
  *
  * @author Florian Pfeifer & Dirk Weber
  * @version 1.0
  */
 
public class MenueAnzeige extends Frame implements konfiguration {
    
// Objekte deklarieren
    /** Die Kenntbeziehung zum EB. */
    
private EreignisBearbeiter kenntEB;
    
/** Die Menuleiste. */
    
private MenuBar mb;
    private final 
String[]    kenntMenuePunkte      KONST_MENUE_AUFSCHRIFTEN;
    private final 
String[][]  kenntMenueEintraege  KONST_MENUE_EINTRAEGE;
    private final 
int[][]       kenntMenueEreignisse KONST_MENUE_EINTRAG_EREIGNIS;   
    
/**
      * Der Konstruktor erzeugt den Frame und das Menü.
      *
      * @param pEB die Ereignisanwendung
      */
    
public MenueAnzeige(final EreignisBearbeiter pEB) {
        
super(KONST_AUFSCHRIFT_TITEL);
        
kenntEB pEB;
        
// Menüleiste initialiseren
        
mb = new MenuBar();
        
this.erzeugeFrame();
    }
    private 
void erzeugeMenue() {
        
// Menüs initialisieren
        
for(int i=0i<kenntMenuePunkte.length 1i++) {
            
Menu hatMenuePunkt = new Menu(kenntMenuePunkte[i]);
            
// Menüunterpunkte hinzufügen
            
for(int j=0j<kenntMenueEintraege[i].length -1j++) {
                
// Abfrage ob Eintrag nur ein Separator sein soll
                
if(kenntMenueEintraege[i][j].equals("-")) {
                    
hatMenuePunkt.addSeparator();
                } else { 
                    
// MenuItem erzeugen
                    
MenuItem hatMenueEintrag = new MenuItem(kenntMenueEintraege[i][j]);
                    
// MenuItem dem Menu hinzufügen
                    
hatMenuePunkt.add(hatMenueEintrag);
                    
// Action Listener hinzufügen
                    
final int a i; final int b j;
                    
hatMenueEintrag.addActionListener(new ActionListener() {
                            public final 
void actionPerformed(final ActionEvent e) {
                            
kenntEB.bearbeiteEreignis(kenntMenueEreignisse[a][b]); } });
                }
            }
            
// Fertiges Menü der Menüleiste hinzufügen
            
mb.add(hatMenuePunkt);
        }
    }
    private 
void erzeugeFrame() {
        
this.setResizable(false);
        
this.setBoundsKONST_BILDSCHIRM_BREITE 2,
                        
KONST_BILDSCHIRM_HOEHE 2,
                        
KONFIG_MENUE_BREITE,
                        
KONFIG_MENUE_HOEHE);
        
this.setBackground(KONFIG_MENUE_HINTERGUNDFARBE);
        
this.setVisible(true);
        
this.toFront();
        
repaint();
        
this.erzeugeMenue();
        
this.addWindowListener(new WindowAdapter() {
                public final 
void windowClosing(final WindowEvent e) {
                    
kenntEB.bearbeiteEreignis(KONST_EREIGNIS_BEENDEN);
                }
            });
    }
    

Das Menü wird mir halt nicht angezeigt und ich habe keine Ahnung warum.
__________________
`B ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.02.2005, 11:03   Nach oben    #6
Sym
Chefkoch-Mod
 
Benutzerbild von Sym
 
Registriert seit: 30.05.2004
Beiträge: 433
Standard

Jau,

in Deiner Initialisierungsmethode fehlt ein
Code:
this.setMenuBar(mb)
__________________
Denk mal darüber nach...

Lars

ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen.
www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de
Sym ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Vokabeltrainer asenodin Allgemeine Java-Programmierung 9 28.05.2006 21:04
Eigene Action Klasse, ähnlich Listener Struktur programmieren? missiju Allgemeine Java-Programmierung 2 19.12.2005 12:24


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:17 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44