Dialog aus Menü aufrufen

Status
Nicht offen für weitere Antworten.

mknapp

Mitglied
Hallo,
mein Problem ist folgendes: welchen Namen für den Frame (in dem sich eine Menuleiste befindet) übergebe ich an den Konstruktor von MyDialog, damit sich der Dialog aus einem Menu-Eintrag öffnet? Im Konstruktor steht "Frame owner". Wie muss ich MyDialog in der MyMenu-Klasse also instanzieren, damit es klappt? Mit this-Zeiger geht es nicht, ich denke man muss den Namen des Vater-Frames übergeben. Aber welches ist der Name?


Code:
public class Listing
extends Frame
{
  public static void main(String[] args)
  { 
    Listing wnd = new Listing();
    wnd.setLocation(0,0);
    wnd.setMenuBar(new MyMenu());                           
    wnd.setVisible(true);
    
  }
...




class MyMenu
extends MenuBar
implements ActionListener
{ 
  public MyMenu()
  {
    Menu m;
    m = new Menu("Datei");
    m.add(new MenuItem("Beenden"));
    add(m);
...
}
public void actionPerformed(ActionEvent event){
   String cmd = event.getActionCommand();  
     if (cmd.equals("Beenden")) {
       MyDialog my = new MyDialog();   	 
      }
  }
}
...




class MyDialog 
extends Dialog
{
  public MyDialog(Frame owner){
     super (owner, "", true);
     setBackground(Color.lightGray);
...


Wäre sehr dankbar für Hilfe

Gruß
mknapp
 
Du mußt den Frame ja garnicht angeben. Ist glaub ich sowieso nur damit der Dialog automatisch in der Mitte des Frames geöffnet wird. Wenn du die Position selbst bestimmst kannst du getrost
Code:
super((JFrame)null, "Dialogtitel", true);
schreiben
 
@thE:
getParent() ist eine gute Idee, aber liefert leider einen Rückgabewert vom Typ MenuContainer. Zeile 45 benötigt allerdings ein Frame-Objekt, welches der Dialog-Klasse übergeben wird. Wie kann ich das Problem lösen?

@Chris:
die Möglichkeit sah zunächst gut aus (kein Compiler-Fehler), funktioniert aber leider nicht. Beim Klick auf das MenuItem kommt eine ganze Reihe Exceptions ("null owner window" und "unknown source"...). Vielleicht geht das nur bei Swing (du hattest JFrame als Bsp.); könnte sein, dass das bei AWT anders ist?
 
Also ich hab mal eben in dem geilen JavaEditor was zusammen geklickt und da funzt des auch mit AWT. :roll:



Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends Frame {

  public Test(String title) {

    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);
    Panel cp = new Panel();
    cp.setLayout(null);
    add(cp);

    setResizable(false);
    setVisible(true);
    
    Dialog dialog = new MyDialog();
    dialog.setVisible(true);
  }

  class MyDialog extends Dialog
  {
    MyDialog()
    {
      super((Frame)null, "Frage", true);
      add(new Button("Testing"));
      setSize(100, 100);
      addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    }

  }

  public static void main(String[] args) {
    new test("test");
  }
}

Ich nehm also mal an das die Fehler von wo anders herrühren.
Poste doch mal die ganze Fehlermeldung und die komplette myDialog-Klasse.
 
Code:
import java.awt.*;
import java.awt.event.*;

class MyDialog 
extends Dialog
implements ActionListener

{
  public MyDialog(Frame owner){
	  super ((Frame)null, "", true);
	  setBackground(Color.lightGray);
	  setLayout(new BorderLayout());
	  setResizable(false);
	  Point parloc = owner.getLocation();
	  setLocation(parloc.x + 30, parloc.y + 30);
	  add(new Label("Schließen"), BorderLayout.CENTER);
      Panel panel = new Panel();
      panel.setLayout(new FlowLayout(FlowLayout.CENTER));
      Button button = new Button("Ok");
      button.addActionListener(this);
      panel.add(button);
      add(panel, BorderLayout.SOUTH);
      setVisible(true);
      pack();
  }
  
  public void actionPerformed(ActionEvent event){
	  String cmd = event.getActionCommand();  
      if (cmd.equals("Ok")) {
    	  setVisible(false);
    	  dispose();
      }
  }
}


die Fehlermeldungen lauten:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: null owner window
at java.awt.Window.ownedInit(Unknown Source)
at java.awt.Window.<init>(Unknown Source)
at java.awt.Dialog.<init>(Unknown Source)
at MyDialog.<init>(MyDialog.java:10)
at MyMenu.actionPerformed(Menu.java:33)
at java.awt.MenuItem.processActionEvent(Unknown Source)
at java.awt.MenuItem.processEvent(Unknown Source)
at java.awt.MenuComponent.dispatchEventImpl(Unknown Source)
at java.awt.MenuComponent.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Code:
  public MyDialog(Frame owner)
  { 
      super ((Frame)null, "", true); 
      setBackground(Color.lightGray); 
      setLayout(new BorderLayout()); 
      setResizable(false); 
//      Point parloc = owner.getLocation(); 
//      setLocation(parloc.x + 30, parloc.y + 30); 
      add(new Label("Schließen"), BorderLayout.CENTER); 
      Panel panel = new Panel(); 
      panel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
      Button button = new Button("Ok"); 
      button.addActionListener(this); 
      panel.add(button); 
      add(panel, BorderLayout.SOUTH); 
      pack(); 
      setVisible(true);       
  }
 
Moment mal - du übergibst dem Dialog doch jetzt schon den owner - schreib' den doch einfach dort rein, wo jetzt das (Frame)null steht!? ???:L
 
naja, sein eigentliches Problem ist ja, das er nicht in der Lage ist sich ne Referenz auf seinen Frame zu behalten und diesen dann eben an den Konstruktor weiterzugeben. :?
 
Ach sorry. Naja. Man könnte jetzt ganz brutal sein, und dem "MyMenu" im Konstruktor den Frame mitgeben, den es dann speichert und an den Dialog weiterreichen kann....
 
ich würde ja gern den Frame mitgeben, das Problem ist nur, ich weiß die Bezeichnung des Frames nicht. Es funktioniert weder mit 'wnd', noch mit 'this', auch nicht mit 'super.Listing' u.s.w. Es muss doch möglich sein, irgendwie den Bezugsframe übergeben zu können.

Innerhalb der Listing-Klasse, die sich aus Frame ableitet, kann ich schreiben "new MyDialog(this);" und es klappt. Somit kann ich einen Button in den Frame setzen, der beim anklicken den Dialog zeigt. Ich will aber den Dialog angezeigt bekommen, wenn ich im Menu ein entsprechendes MenuItem anklicke. Das geht meines Wissens nur über den Umweg einer eigenen Menu-Klasse. In dieser kann ich aber leider nicht mehr mit dem this-Zeiger arbeiten...

Wenn jemand ein einfaches Schema hat, einen (modalen)Dialog über einen Menüpunkt in einem Frame zu öffnen, wäre ich sehr dankbar, wenn er es posten könnte...
 
wnd ist dein Frame ja? Und den brauchst du im Menu, weil du ihn im Menu an den Dialog übergeben möchtest?

Code:
public class Listing 
extends Frame 
{ 
  public static void main(String[] args) 
  { 
    Listing wnd = new Listing(); 
    wnd.setLocation(0,0); 
    wnd.setMenuBar(new MyMenu(wnd));                 // geändert           
    wnd.setVisible(true); 
    
  } 
... 




class MyMenu 
extends MenuBar 
implements ActionListener 
{
  private Frame owner;                                        // neu
 
  public MyMenu(Frame owner)                             // geändert    
  {
    this.owner = owner;                                         // neu
 
    Menu m; 
    m = new Menu("Datei"); 
    m.add(new MenuItem("Beenden")); 
    add(m); 
... 
} 
public void actionPerformed(ActionEvent event){ 
   String cmd = event.getActionCommand();  
     if (cmd.equals("Beenden")) { 
       MyDialog my = new MyDialog(owner);             // geändert    
      } 
  } 
} 
... 




class MyDialog 
extends Dialog 
{ 
  public MyDialog(Frame owner){ 
     super (owner, "", true); 
     setBackground(Color.lightGray); 
...
 
Juhuu, es hat geklappt! Vielen Dank Chris, du hattest die Lösung! Danke auch an alle anderen, die sich bemüht haben.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben