PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Dialog aus MenuItem-ActionListener aufrufen?



Harry
06-05-2002, 17:57
Hallo,

ich möchte innerhalb einer GUI-Applikation einen neuen modalen Dialog erzeugen, sobald der Anwender einen bestimmten Menüeintrag ausgewählt hat.

Nur: Ein Dialog benötigt im Konstruktor entweder eine Referenz auf ein übergeordnetes Frame-Objekt oder ein Dialog-Objekt und den habe ich im ActionListener, der hier ja einem MenuItem-Objekt zugeordnet wird, nicht zur Verfügung.

Ich poste hier mal den relevanten Codeabschnitt; in der Klasse MyMenuBar habe ich meine "Sorgenzeile" nochmal kenntlich gemacht:



import java.awt.*;
import java.awt.event.*;

public class meineGUI extends Frame {

public meineGUI() {
super("Mein Titel");
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
MyMenuBar myMenuBar = new MyMenuBar(this);
setMenuBar(myMenuBar);
// GridBagLayout-Krams gelöscht
setVisible(true);
}

public static void main(String[] args) {
meineGUI wnd = new meineGUI();
}
}

class MyMenuBar extends MenuBar {

public MyMenuBar() {
Menu m = new Menu("Datei");
m.add(MenuItem me = new MenuItem("Einstellungen", new MenuShortcut('e')));
me.setActionCommand("Einstellungen");
/*--->*/me.addActionListener(new PropertyDialog(?, "Eigenschaften", true));
add(m);
}
}

class PropertyDialog extends java.awt.Dialog implements ActionListener {

public PropertyDialog(Dialog owner, String title, boolean modal) {
// Initialisierungen
}

public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
String cmd = actionEvent.getActionCommand();

if (cmd.equals("Einstellungen")) {
// Dialog "malen"
}
}
}


Tja, wie komme ich da (dort wo das "?" steht) an eine Referenz eines Frame- oder Dialog-Objekt?
Oder sollte ich da von der Konzeption anders rangehen?

Harry

anda_skoa
06-05-2002, 18:14
Ich denke es wäre besser, wenn du die Menüs und ihre Aktionen von außen hinzufügst.

Also in etwas so:


public meineGUI {
// was auch immer
MyMenuBar mb = new MyMenuBar(this);
setMenuBar(mb);
Menu menu = mb.getMenu();

initMenus(menu);
}

void initMenus(Menu menu) {
// Menüs initalisieren.
}


ist noch die Frage, ob du eine eigen Subklasse von Menubar brauchst.

Ciao,
_

Harry
06-05-2002, 20:22
Hallo anda_skoa,

erstmal danke für Deine fixe Antwort :-)

Eine Subklasse von MenuBar brauch ich in der Tat nicht.
Wenn ich jetzt gemäß Deinem Vorschlag vorgehe, dann habe ich mein Problem wohl immer noch nicht gelöst.



public meineGUI {
// was auch immer
MenuBar mb = new MenuBar(this);
setMenuBar(mb);
Menu menu = mb.getMenu();
initMenus(menu);
}

void initMenus(Menu menu) {
// Menüs initalisieren.
Menu m = new Menu("irgendwas");
m.add(MenuItem me = new MenuItem("Einstellungen"));
me.addActionListener(new ActionListener(Dialog d = new Dialog(?, "Eigenschaften", true));
}


Irgendwie komme ich beim Aufruf des ActionListeners dennoch nicht an die Referenz des Frame-Objektes oder habe ich da jetzt was übersehen?

Harry

anda_skoa
06-05-2002, 20:28
Original geschrieben von Harry
Hallo anda_skoa,

erstmal danke für Deine fixe Antwort :-)



hehe, das nenn ich fix :D



Irgendwie komme ich beim Aufruf des ActionListeners dennoch nicht an die Referenz des Frame-Objektes oder habe ich da jetzt was übersehen?


Jup :)

Du bist in einer Methode von meineGUI, also reicht ist this eine Referenz auf eine Frameinstanz.



me.addActionListener(new ActionListener(Dialog d = new Dialog(this, "Eigenschaften", true));


Allerdings wäre es schöner, wenn du das erzeugen von Objecten nicht mittem im Statement machst, wenn du die Refernz noch in einer Variable haben willst.

Also


Dialog d = ....;
me.addActionListener(new ActionListener(d));


Ciao,
_

Harry
06-05-2002, 20:41
Original geschrieben von anda_skoa



hehe, [b]das nenn ich fix :D


Haha - das ist cool :D



Jup :)

Du bist in einer Methode von meineGUI, also reicht ist this eine Referenz auf eine Frameinstanz.

Allerdings wäre es schöner, wenn du das erzeugen von Objecten nicht mittem im Statement machst, wenn du die Refernz noch in einer Variable haben willst.

Also


Dialog d = ....;
me.addActionListener(new ActionListener(d));




Ich denke, jetzt ist der Groschen gefallen. Dankefein :-)

Harry