Abbrechen Dialog - Aufrufenden Frame schließen

ClD

Mitglied
Hallo,

ich habe eine GUI entworfen, oder bin dabei.
Ich habe einen Dialog der erscheint, wenn Abbrechen geklickt wurde. Der Benutzer wird gefragt, ob er wirklich abbrechen will. Klickt er nein, kommt er zurück zur GUI, klickt er ja, soll der Dialog und der Frame, von dem aus der Aufruf kam geschlossen werden.
Den Dialog zu schließen ist ja kein Problem, aber ich weiß noch nicht, wie ich den aufrufenden Frame schließen kann!?

Für einen Hinweis wäre ich sehr dankbar!
 
Moin!
Ich nehm doch mal an, dass du deinen Dialog derart konstruierst?:
Code:
JDialog dia = new JDialog(yourFrame);

Zugriff auf deinen Frame im Dialog bekommst du mit der getOwner() Methode.:
z.B:
Code:
JFrame yourFrame = (JFrame)dia.getOwner();
yourFrame.dispose();

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Hallo MeinerEiner,

ich habe meine GUI mit dem VisualEditor für Eclipse erstellt.
Dort habe ich einen Dialog erstellt, welches ich mit
Code:
public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed(Abbrechen)"); // TODO Auto-generated Event stub actionPerformed()
					new DialogAbbrechen(new javax.swing.JFrame()).show();
				}
			});
nach drücken eines Buttons aufrufe.

Danach soll dann, wenn im Dialog ein Button gedrückt wird, der Dialog und das aufrufende Frame geschlossen werden.

Da müsste ich es doch irgendwie anders machen, oder?
 
Moin!
Wenn ich dich jetzt richtig vestanden habe, hast du nur nen Dialog mit okay und abbrechen?
Wenn ja, geht das in der Tat viel einfacher. Du musst nicht extra nen eigenen Dialog erstellen, sondern nutzt das JOptionPane:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JOptionPane.html
Code:
Object[] options = {"okay","cancel"};
int n = JOptionPane.showOptionDialog(yourFrame,
    "close Frame?",
    "title",
    JOptionPane.YES_NO_OPTION,
    JOptionPane.QUESTION_MESSAGE,
    null,
    options,
    options[2]);
if(n==JOptionPane.OK_OPTION){
    //okay was pressed
   //do your operations
}
else if(n == JOptionPane.NO_OPTION){
    //no button was pressed
     //do your operations
}

*grüssle*
MeinerEiner
 
Du hast mich schon richtig verstanden.
Ich habe in einem Frame nen Button Abbrechen. Wird der gedrückt, soll noch einmal abgefragt werden, ob abgebrochen werden soll (dazu den Dialog).
Soll abgebrochen werden, soll der Dialog und der Frame, auf dem der Abbrechen-Button gedrückt wurde geschlossen werden.

Das OptionPane leuchtet mir eigentlich ein, jedoch bekomme ich es nicht hin, das einzubauen.
Das müsste dann doch in den Event des Abbrechen-Buttons rein, oder?
 
Ich habe jetzt folgendes:
Code:
button_abbrechen.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed(Abbrechen)"); // TODO Auto-generated Event stub actionPerformed()
					//new DialogAbbrechen(new javax.swing.JFrame()).show();
					
					//Abbrechen Dialog
					Object[] options = {"okay","cancel"};
					int n = JOptionPane.showOptionDialog(null,
						    "close Frame?",
						    "title",
						    JOptionPane.YES_NO_OPTION,
						    JOptionPane.QUESTION_MESSAGE,
						    null,
						    options,
						    options[2]);
					if(n==JOptionPane.OK_OPTION){
					    //okay was pressed
					   //do your operations
					}
					else if(n == JOptionPane.NO_OPTION){
					    //no button was pressed
					     //do your operations
					}
				}
			});

Das führt allerdings bei klicken des Buttons Abbrechen zu Fehlern.
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
	at org.eclipse.tippsport.FrameEigeneDaten$2.actionPerformed(FrameEigeneDaten.java:357)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.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)
 
Moin!
Jo mein Fehler, das kommt davon, wenn man den Code nicht testet, bevor man ihn postet *g* .. Das options Array hat ja nur 2 elemente. Ergo, so ändern:
int n = JOptionPane.showOptionDialog(null,
"close Frame?",
"title",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[0]); // oder 1, statt 2

*grüssle*
MeinerEiner
 
Jetzt klappt es mit dem neuen Dialog.
Jetzt stehe ich aber immer noch am Anfang.
Denn nun soll sich ja beim Klick auf ja, also options[0] auch der aufrufende Frame schließen.
Wenn du mir noch sagen kannst, wie ich das realisiere bist du fürs erste mein Held ;) !


Sory, ist ja ganz einfach!
setVisible(false);
dispose();


Jetzt habe ich noch eine Frage und hoffe auf eine Antwort ;)
Lässt sich unterscheiden, von welchem Frame der Dialog aufgerufen wurde?
Ich nutze zB eine Eingabemaske, welche von zwei verschiedenen Stellen aus aufgerufen werden kann.
Wird sie von der einen aus aufgerufen, soll nach dem Abbrechen der Aufrufende Frame geschlossen werden, bei der anderen Stelle soll der Frame nicht geschlossen werden.
Wenn das möglich ist, wäre ich rundum zufrieden und das thema Dialog-Abbrechen erledigt.

schon einmal vielen Dank für deine Geduld mit mir!
 
Zuletzt bearbeitet:
Nun die einfachste Möglichkeit wäre wohl, wenn du das Frame, welches den Aufruf macht, einfach als Paramter übergibst. Dazu würde ich dem den Frames noch unterschiedliche Namen geben, um sie auch unterscheiden zu können.
Sobald der Button nun aufgerugen wurden, könnte es etwa derart aussehen:

Code:
public EingabeMaske extends JComponent{
private JFrame parentFrame = null;

public void showMask(JFrame caller){
   this.parentFrame = caller;
   this.setVisible(true);
}

....

button_abbrechen.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
                   
....
....
       if(n==JOptionPane.OK_OPTION){
            if(parentFrame.getName().equals("name1"){
                System.out.println(right frame, close it);
                parentFrame.dispose();
            }
            else{
                System.out.println(wrong frame, dont close);
            }
        }

        else if(n == JOptionPane.NO_OPTION){
            // no button was pressed
            // do your operations
        }
    }
});

*grüssle*
MeinerEiner
 
Hey, sorry, aber ich bekomms nicht hin.


Ich erzeuge bei Knopfdruck eine neue Maske:
Code:
button_neuerSpieler.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					login = new FrameNeuerSpieler("login", login);
                                 }
              }

Im Konstruktor von FrameNeuerSpieler:
Code:
public FrameNeuerSpieler(String aufrufer, JFrame caller) {
		super();
		initialize();
		this.aufrufer = aufrufer;
		this.caller = caller;
		setVisible(true);
		System.out.println("Konstruktor aufgerufen");
	}

Dann die Unterscheidung:
Code:
public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed(Speichern - von NeuerSpieler)"); 
					
					//wenn Aufrufer FrameLogin war 
					
					if (aufrufer.equals("login")) {
						new FrameHauptfenster(new javax.swing.JFrame()).show();
						System.out.println(""+aufrufer);
						
						// }
						//Daten speichern
						System.out.println("Frame NeuerSpieler ausblenden");
						setVisible(false); // Frame ausblenden
				        dispose();
				        
				        System.out.println("Aufrufer ausblenden");
						caller.setVisible(false); //FEHLER
					}
					else {
						System.out.println("Aufrufer war nicht login");
						setVisible(false);
					}
				}

Bei dem Aufruf caller.setVisible(false); knallt es und ich weiß nicht warum?!
Hast du noch eine Idee?
 
Zurück