# Fenster schliessen



## flashdog (17. Aug 2008)

Hallo,
in einem zweiten Fenster befindet sich ein Sende-Button, wenn man auf diesen klickt so soll sich nur das Fenster schliessen in dem sich der Sende-Button befindet.

```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.Border;

public class BallRoom extends JApplet implements ActionListener, Runnable {
	private final int WIDTH = 350;
	private final int HEIGHT = 300;

	private JButton openPopup, ChooseSendFile, send;
	private JFrame SettingFrame;
	JRadioButton yes, no;
	ButtonGroup groupRadio;
	JPanel groupPanel, southPanel;
	JTextField PathToSendFile;
	JFileChooser SendFile;
	String SendMsg = null;

	public void init() {
		this.setSize(WIDTH, HEIGHT);
		SettingFrame = new JFrame("Einstellungen");
		SettingFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		openPopup = new JButton("Einstellungen");
		openPopup.addActionListener(this);
		JPanel topPanel = new JPanel();
		this.add(topPanel, BorderLayout.NORTH);
		topPanel.add(openPopup);

		yes = new JRadioButton("Ja");
		yes.addActionListener(this);
		no = new JRadioButton("Nein");
		no.addActionListener(this);
		no.setSelected(true);
		PathToSendFile = new JTextField(20);
		PathToSendFile.setEditable(false);
		ChooseSendFile = new JButton("Open");
		ChooseSendFile.setEnabled(false);
		ChooseSendFile.addActionListener(this);

		groupPanel = new JPanel();
		Border b1 = BorderFactory.createTitledBorder("Datei senden?");
		groupPanel.setBorder(b1);
		southPanel = new JPanel();
		groupRadio = new ButtonGroup(); 
		groupPanel.add(yes);
		groupRadio.add(yes);
		groupPanel.add(no);
		groupRadio.add(no);
		groupPanel.add(PathToSendFile);
		groupPanel.add(ChooseSendFile);

		send = new JButton("Senden");
		send.addActionListener(this);
		southPanel.add(send);
		SettingFrame.add(groupPanel, BorderLayout.NORTH);
		SettingFrame.add(southPanel, BorderLayout.SOUTH);

	}
	public void run() {
	}

	public void actionPerformed(ActionEvent e){
		if (e.getSource() == openPopup){
			SettingFrame.setSize(500, 400);
			SettingFrame.setVisible(true);
		}
		if (e.getSource() == yes){
			PathToSendFile.setEditable(true);
			ChooseSendFile.setEnabled(true);
		}
		if (e.getSource() == no){
			PathToSendFile.setEditable(false);
			ChooseSendFile.setEnabled(false);
		}  
		if (e.getSource() == send){
			System.out.print(SendMsg);
		}
	}
}
```

Wie schliesst man das zweite Fenster durch Sende-Button?

Viele Gruesse


----------



## André Uhres (17. Aug 2008)

Ein Fenster schliessen wir mit der Methode Window#dispose()


----------



## flashdog (17. Aug 2008)

Danke hat funktioniert.

Wenn sich das zweite Fenster geoeffnet hat ist leider immer noch das erste Fenster aktiv, so dass man dort arbeiten kann.

Wie blockiert man das erste Fenster, so dass das zweite Fenster aktiv ist und erst wenn der Sende Knopf gedrueckt wurde kann man in den ersten Fenster weiter arbeiten?


----------



## Wildcard (17. Aug 2008)

Mehr als einen JFrame sollte es nicht geben. Für alles weitere werden Dialoge verwendet (JDialog). 
Dialoge lassen sich dann auch auf modal, also blockierent setzen.


----------



## flashdog (17. Aug 2008)

Das erste Fenster ist ein Applet nur das zweite Fenster ist ein JFrame.

Kann man einen JDialog auch Knoepfe wie Senden hinzufuegen und das Layout belibieg anpassen wie beim JFrame?


----------



## Wildcard (17. Aug 2008)

Ja


----------



## flashdog (18. Aug 2008)

Leider bekomme ich JDialog nicht zum laufen.

```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


public class BallRoomJDialog extends JApplet implements ActionListener, Runnable {
	private final int WIDTH = 350;
	private final int HEIGHT = 300;

	private JButton openPopup, ChooseSendFile, send, test;
	private JFrame SettingFrame;
	JRadioButton yes, no;
	ButtonGroup groupRadio;
	JPanel groupPanel, southPanel;
	JTextField PathToSendFile;
	JFileChooser SendFile;
	String SendMsg = null;

	public void init() {
		this.setSize(WIDTH, HEIGHT);
		openPopup = new JButton("Einstellungen");
		openPopup.addActionListener(this);
		JPanel topPanel = new JPanel();
		this.add(topPanel, BorderLayout.NORTH);
		topPanel.add(openPopup);
		
		test = new JButton("test");
		test.addActionListener(this);
		JPanel downPanel = new JPanel();
		this.add(downPanel, BorderLayout.SOUTH);
		downPanel.add(test);
	}
	public void run() {
	}

	public void actionPerformed(ActionEvent e){
		if (e.getSource() == openPopup){
			SettingFrame getUrl = new SettingFrame (this, "Einstellungen");
		
		}
		if (e.getSource() == test){
			System.out.print("TEST");
		}
	}
}
```


```
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class SettingFrame extends JDialog implements ActionListener {
  public SettingFrame(BallRoomJDialog ballRoomJDialog, String title) {
    super(ballRoomJDialog, title);
    JPanel messagePane = new JPanel();
    messagePane.add(new JLabel("Hallo"));
    getContentPane().add(messagePane);
    JPanel buttonPane = new JPanel();
    JButton button = new JButton("OK"); 
    buttonPane.add(button); 
    button.addActionListener(this);
    getContentPane().add(buttonPane, BorderLayout.SOUTH);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    pack(); 
    setVisible(true);
  }

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
```

Was mache ich falsch und ist ein Problem das man mehre ActionListener hat?


----------



## Quaxli (18. Aug 2008)

Dir fehlt eigentlich nur noch etwas "Leben" in der actionPerformed-Methode, dann geht's:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SettingFrame extends JDialog implements ActionListener {
	
	private static final long	serialVersionUID	= 1L;

  public SettingFrame(BallRoomJDialog ballRoomJDialog, String title) {

     //super-Aufruf gelöscht, da unpassend, dafür setModal nochmal explizit aufgerufen
    setModal(true);
    getContentPane().add(new JPanel().add(new JLabel("Hallo"))); // <<< Zeilen reduziert da momentan unnötig

    JPanel buttonPane = new JPanel();
    JButton button = new JButton("OK");
    button.setActionCommand("ok");   // <<< neu hinzugefügt
    buttonPane.add(button);
    button.addActionListener(this);
    
    getContentPane().add(buttonPane, BorderLayout.SOUTH);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    pack();
    setVisible(true);
  }

	public void actionPerformed(ActionEvent e) {
		
		if(e.getActionCommand().equals("ok")){  //<<< ab hier Abfrage des Buttons
			dispose();
		}
		
	}


}
```


----------



## flashdog (19. Aug 2008)

Danke, aber leider erscheint kein Titel in JDialog. 

Wie bekommt ein Titel fuer JDialog gesetzt?


----------



## Quaxli (19. Aug 2008)

Steht in der API....


----------



## flashdog (19. Aug 2008)

In der API steht es so aehnlich wie ich es veruchst hatte:

API:

```
JDialog(Dialog owner, String title)
          Creates a non-modal dialog with the specified title and with the specified owner dialog.
```

or 


```
JDialog(Frame owner, String title)
          Creates a non-modal dialog with the specified title and with the specified owner frame.
```

und hatte hier (http://www.java-forum.org/de/viewtopic.php?p=438844#438844)


```
public SettingFrame(BallRoomJDialog ballRoomJDialog, String title) {
    super(ballRoomJDialog, title);
```

Aber da bekomme ich fehler. Was mache ich falsch?


----------



## SlaterB (19. Aug 2008)

> Was mache ich falsch?

du postest nicht die Fehlermeldung....


------

BallRoomJDialog ist außerdem kein Frame, also kannst du BallRoomJDialog nicht an super weitergeben,
sind das wirklich zu schwere Gedankengänge?
Funktion x erwartet A, ich übergebe B, B != A, was sogar die Fehlermeldung auch sagen wird
-> keine Idee was hier schief läuft?

------

die Frage, was stattdessen zu tun ist, ist ja noch halbwegs legitim,
aber mit bisschen Nachdenken kommt man auch da weiter,

a)
wenn du den super-Aufruf erflogreich weglassen kannst, dann scheinen die Parameter ja nicht wirklich wichtig zu sein, 
dann könnte man ruhig auch mal
super(null,title);
ausprobieren, 
wenns nicht klappt ist das kein Beinbruch, dafür hat man selber nachgedacht, das wäre also eher positiv zu bewerten

b)
immer daran denken, dass es auch sowas wie
setTitle(title);
geben kann


----------



## flashdog (20. Aug 2008)

Das naechste mal werde ich auch die Fehlermeldungen posten.

Ich hatte alles moegliche ausprobiert und dann habe ich den Vorschlag von Eclipse angenommen. Ausserdem habe ich auch alle moeglichen super Aufrufe durchgefuehrt, aber ohne Erfolg und deshalb habe ich mich hier ans Forum gewandt.

Mein Problem war die ganze Zeit, dass ich JDialog nicht in Verbindung mit Applet gesucht habe. Diesen Fehler habe ich heute korrigiert und folgende Seite gefunden: http://www.javalobby.org/java/forums/t101693.html .

Der Schluessel zum Erfolg war "Frame rootFrame = JOptionPane.getFrameForComponent(this); ".

Aber trotzdem Danke.


----------



## flashdog (23. Aug 2008)

Leider habe ich keine Ahnung wie man die JTextField-Inhalte aus dem Popup Fenster wieder in die JTextField-Inhalte in dem Hauptfenser zurück schrieben kann, nachdem man den Schliessen Button betätigt hat. 


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Test extends JApplet implements ActionListener, Runnable {
	private final int WIDTH = 350;
	private final int HEIGHT = 300;

	private JButton openPopup;
	private ButtonGroup groupRadio;
	
	private JTextField m_start, m_stop;
	String SendMsg = null;
	private Frame rootFrame;
	
	public void init() {
		rootFrame = JOptionPane.getFrameForComponent(this); //For JDialog
		this.setSize(WIDTH, HEIGHT);
		
		JPanel topPanel = new JPanel();
		this.add(topPanel, BorderLayout.NORTH);
		m_start = new JTextField("7", 5);
		m_start.setEditable(true);
		m_start.addActionListener(this);
				
		m_stop = new JTextField("10", 5);
		m_stop.setEditable(true);
		m_stop.addActionListener(this);
		
		openPopup = new JButton("Einstellungen");
		openPopup.addActionListener(this);
		
		topPanel.add(m_start);
		topPanel.add(m_stop);
		topPanel.add(openPopup);
	}
	public void run() {
	}

	public void actionPerformed(ActionEvent e){
		if (e.getSource() == openPopup){
			Popup pop = new Popup(rootFrame, "Einstellungen", true, 
					m_start.getText(), m_stop.getText());
			//dialog.setSize(500, 300);
			pop.pack();
			pop.setResizable(false);
			pop.setVisible(true);
		}
	}
}
```


```
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Popup extends JDialog implements ActionListener {
	private JButton close;
	private JPanel southPanel;
	private JTextField p_start, p_stop;
	private String SendMsg = null;
	
	public Popup(Frame rootFrame, String title, boolean modal, 
			String start, String stop) {
		super(rootFrame, title, modal);
		
		southPanel = new JPanel();
		close = new JButton("schliessen");
		close.addActionListener(this);
		southPanel.add(close);
 
		p_start = new JTextField(20);
		p_start.setEditable(true);
		p_start.setText(start);
		p_start.addActionListener(this);
		//p_start.add(p_start);
		southPanel.add(p_start);

		p_stop = new JTextField(20);
		p_stop.setEditable(true);
		p_stop.setText(stop);
		p_stop.addActionListener(this);
		//p_stop.add(p_stop);
		southPanel.add(p_stop);
 
		getContentPane().add(southPanel, BorderLayout.SOUTH); 
	}

	public void actionPerformed(ActionEvent e){
		if (e.getSource() == p_start){
			System.out.println("p_start" + p_start.getText());
		}		
		if (e.getSource() == p_stop){
			System.out.println("p_stop" + p_stop.getText());
		}
		if (e.getSource() == close){
			System.out.print(SendMsg);
			dispose();
		}
	}
	
}
```


Kann eine Klasse Werte zurückliefern?


----------



## SlaterB (23. Aug 2008)

> Kann eine Klasse Werte zurückliefern?

kann ein X grün sein?
es machen nur sinnvolle Sachen Sinn, beliebige Wörter darf man nicht kombinieren

ein Rückgabewert ist mit einer Aktion verbunden, z.B. einem Methodenaufruf, 
eine Klasse für sich macht gar nix

------

zwei Möglichkeiten
a)
bei einem modalen Dialog dürfte der ActionListener von Test in Zeile 49 verharren,
dann kannst du nach dem Schließen dort auf pop zugreifen, z.B. 
pop.getIrgendeinenString();
b)
du übergibst Popup im Konstruktor eine Referenz auf Test
und in dessen ActionListener in Zeile 53 nach dispose()
rufst du 
test.hierHastDuInfoVonMir(info);
auf


----------



## André Uhres (23. Aug 2008)

http://www.java-forum.org/de/viewtopic.php?p=402299#402299


----------



## flashdog (27. Aug 2008)

Das mit Referenz hoert sicht gut an. Wenn ich etwas in JTextField aendere muss ich immer Enter druecken damit die Aenderunge abgespeichert werden. Ich verwende ActionListener und actionPerformed wahrscheinlich sind es die falschen Listener. Welcher Listener ist am besten JTextField?


----------



## André Uhres (27. Aug 2008)

JTextComponent#.getDocument().addDocumentListener(..)


----------

