# JFrame schließen, Kommazahlen einlesen



## epimetheus_xxx (1. Feb 2007)

Ich bin fast fertig mit meinem Programm es sind nur nur zwei Kleinigkeiten. Und wir haben schon viel probiert, sind aber zu keiner Lösung gekommen.

1. Problem:
Das JFrame mit dem Bild, soll bei Betätigung des Buttons Zurück ebenfalls geschlossen werden. Wie implementiere ich das in den ActionListener?

2. Problem:
Wie können die Textfelder Kommazahlen einlesen? Geht das überhaupt mit dem DecimalFormat?

Danke für Eure Hilfe.



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

public class Hohlzylinder extends JFrame implements ActionListener
{
	// Variablendeklaration
	private JFormattedTextField tfd1;
	private JFormattedTextField tfd2;
	private JFormattedTextField tfh;
	private double durchmesser1;
	private double durchmesser2;
	private double hoehe;
	
	// Konstruktor
	public Hohlzylinder ()
	{
		// Fenstereigenschaften
		super ("gerader Hohlzylinder");
		setSize (800, 400);
		setLayout (new GridLayout (6, 1));
		
		// Panels
		JPanel titel = new JPanel ();
		JPanel durchmesser1 = new JPanel ();
		JPanel durchmesser2 = new JPanel ();
		JPanel hoehe = new JPanel ();
		JPanel berechnen = new JPanel ();
		JPanel button = new JPanel ();
		
		// Panelhintergrund
		titel.setBackground (Color.yellow);
		durchmesser1.setBackground (Color.cyan);
		durchmesser2.setBackground (Color.cyan);
		hoehe.setBackground (Color.cyan);
		berechnen.setBackground (Color.cyan);
		button.setBackground (Color.red);
		
		// Labels
		JLabel titela = new JLabel ("Stereometrie");
		JLabel durchmesser1a = new JLabel ("Durchmesser d_1:");
		JLabel durchmesser2a = new JLabel ("Durchmesser d_2:");
		JLabel hoehea = new JLabel ("Höhe h:");
		
		// Labeleigenschaften
		titela.setFont(new Font ("SansSerif", Font.PLAIN,40));
		durchmesser1a.setFont (new Font( "SansSerif", Font.PLAIN,20));
		durchmesser2a.setFont (new Font ("SansSerif", Font.PLAIN,20));
		hoehea.setFont (new Font ("SansSerif", Font.PLAIN,20));
		
		// Buttons
		JButton zurueck = new JButton ("Zurück");
		JButton beenden = new JButton ("Programm beenden");
		JButton berechnena = new JButton ("Berechnen");
		
		// Textfeld
		tfd1 = new JFormattedTextField (new DecimalFormat ());
		tfd2 = new JFormattedTextField (new DecimalFormat ());
		tfh = new JFormattedTextField (new DecimalFormat ());
		tfd1.setColumns (20);
		tfd2.setColumns (20);
		tfh.setColumns (20);
		
		// Belegung der Panels
		titel.add (titela);
		durchmesser1.add (durchmesser1a);
		durchmesser1.add (tfd1);
		durchmesser2.add (durchmesser2a);
		durchmesser2.add (tfd2);
		hoehe.add (hoehea);
		hoehe.add (tfh);
		berechnen.add (berechnena);
		button.add (zurueck);
		button.add (beenden);
		
		// Einfügen der Panels
		add (titel);
		add (durchmesser1);
		add (durchmesser2);
		add (hoehe);
		add (berechnen);
		add (button);
		
		// Sichtbarkeit des Fensters
		setVisible (true);
		
		// Einbinden der Buttons in den ActionListener
		zurueck.addActionListener (this);
		beenden.addActionListener (this);
		berechnena.addActionListener (this);
		tfd1.addActionListener (this);
		tfd2.addActionListener (this);
		tfh.addActionListener (this);
		
		Hohlzylinderbild ();
	}
	
	// Methode
	public void Hohlzylinderbild ()
	{
		// Fenstereigenschaften und einfügen eines Bildes
			JFrame frame = new JFrame ("Hohlzylindervariablen");
			frame.setDefaultCloseOperation (JFrame.HIDE_ON_CLOSE);
			ImageIcon bild = new ImageIcon (Hohlzylinder.class.getResource ("Hohlzylinder.jpg"));
			JLabel Pic = new JLabel (bild);
			frame.getContentPane ().add (Pic,BorderLayout.CENTER);
			frame.setLocation (800, 0);
			frame.pack();
			frame.setVisible (true);
	}
	

	// Action Methode
	public void actionPerformed (final ActionEvent a)
	{	
	
		// Sprung zurück in die Klasse Rund
		if (a.getActionCommand ().equals ("Zurück"))
		{
			Rund b = new Rund ();
			setVisible (false);
		}
		
		// Programm beenden
		if (a.getActionCommand ().equals ("Programm beenden"))
		{
			System.exit(0);
		}
		
		// Aufrufen der internen Klasse Hohlzylinderbe und auslesen der Textfelder
		if (a.getActionCommand ().equals ("Berechnen"))
		{
			durchmesser1 = Double.parseDouble (tfd1.getText ());
			durchmesser2 = Double.parseDouble (tfd2.getText ());
			hoehe = Double.parseDouble (tfh.getText ());
			Hohlzylinderbe c = new Hohlzylinderbe (this, true, durchmesser1, durchmesser2, hoehe);
			c.setVisible (true);
			return;
		}
	}
}
	
// Klasse Hohlzylinderberechnung
class Hohlzylinderbe extends JDialog
{
	// Variblendeklaration
	private double phi = 3.1416;
	private double A_O;
	private double A_M;
	private double V;
	private double durchmesser1;
	private double durchmesser2;
	private double hoehe;
	private JLabel label1;
	private JLabel label2;
	private JLabel label3;
	
	// Konstruktor
	public Hohlzylinderbe (final Frame parent, final boolean modal,
	final double durchmesser1,
	final double durchmesser2,
	final double hoehe)
	{
		super (parent, "geraden Hohlzylinder berechnen", modal);
		
		// Übernehmen der Variablen
		this. durchmesser1 = durchmesser1;
		this. durchmesser2 = durchmesser2;
		this.hoehe = hoehe;
		
		// Labels
		label1 = new JLabel ("");
		label2 = new JLabel ("");
		label3 = new JLabel ("");
		
		// Einfügen der Labels und Layout
		add (label1, BorderLayout.NORTH);
		add (label2, BorderLayout.CENTER);
		add (label3, BorderLayout.SOUTH);
		
		// Eigenschaften Dialogfenster
		setSize (300,200);
		this.getContentPane ().setBackground (Color.cyan);
		setLocationRelativeTo (parent);
		
		berechnen();
	}
	
	// Methode Berechnung
	private void berechnen()
	{
		// Berechnung
		A_M = phi * hoehe * (durchmesser1 + durchmesser2);
		A_O = (phi / 2) * (durchmesser2 + durchmesser1) * (2 * hoehe + (durchmesser1 - durchmesser2));
		V = (phi / 4) * hoehe * ((durchmesser2 * durchmesser2) + (durchmesser1 * durchmesser1)); 
		
		// Labels beschreiben
		label1.setText (" Oberfläche: "+A_O);
		label2.setText (" Mantelfläche: "+A_M);
		label3.setText (" Volumen: "+V);
	}
}
```


----------



## The_S (1. Feb 2007)

[edit] Antwort wegeditiert, hab gerade festgestellt dass du mir mal übelst ans Bein gepisst hast.


----------



## Azrahel (1. Feb 2007)

So klein die Hobbits auch sind, so übelst nachtragend können sie auch sein


----------



## epimetheus_xxx (1. Feb 2007)

Dann möchte ich mich hiermit ganz offiziel bei Dir entschuldigen.


----------



## The_S (1. Feb 2007)

Wenn jemand ständig nach kurzer Zeit seine Threads pusht, ich ihn darauf aufmerksam mache, dass er schon ne Antwort bekommt und es vom pushen auch net schneller geht, und dann blöde Bemerkungen wie "Ich soll mich net aufführen wie der King" u. ä. an den Kopf geschmissen bekomme, habsch halt keine Lust mehr.

Ich hab nix gegen Meinungsverschiedenheiten, Differenzen oder sonstige kleine Streitigkeiten, aber als Helfender muss ich mich vom Hilfesuchenden net blöd anmachen lassen!


----------



## The_S (1. Feb 2007)

epimetheus_xxx hat gesagt.:
			
		

> Dann möchte ich mich hiermit ganz offiziel bei Dir entschuldigen.



Na dann will ich mal net so sein 

1.) JFrame/JDialog#dispose oder JFrame/JDialog#setVisible(false)
2.)


```
double dbl = Double.parseDouble(textfeld.getText().replace(',', '.'));
```


----------



## epimetheus_xxx (1. Feb 2007)

Danke, das mit den Kommazahlen hab ich hinbekommen. Und ich musste das DecimalFormat weglassen.

Nur beim Schliessen der Fenster komme ich nicht weiter. Die # verwirrt mich etwas.


----------



## The_S (1. Feb 2007)

# ist einfach die Notation von Java, wenn man auf eine Methode verweisen möchte  . In Code könnte das z. B. so aussehen:


```
jframe.setVisible(false);
jdialog.dispose();
```


----------



## epimetheus_xxx (1. Feb 2007)

Okay, aber wenn ich den Befehl im ActionListener so eingebe kommt eine Fehlermeldung das die Variable frame nicht zu finden sei.


```
// Methode
	public void Hohlzylinderbild ()
	{
		// Fenstereigenschaften und einfügen eines Bildes
			JFrame frame = new JFrame ("Hohlzylindervariablen");
			frame.setDefaultCloseOperation (JFrame.HIDE_ON_CLOSE);
			ImageIcon bild = new ImageIcon (Hohlzylinder.class.getResource ("Hohlzylinder.jpg"));
			JLabel Pic = new JLabel (bild);
			frame.getContentPane ().add (Pic,BorderLayout.CENTER);
			frame.setLocation (0, 400);
			frame.setSize(800, 400);
			frame.setVisible (true);
	}
	

	// Action Methode
	public void actionPerformed (final ActionEvent a)
	{	
	
		// Sprung zurück in die Klasse Rund
		if (a.getActionCommand ().equals ("Zurück"))
		{
			Rund b = new Rund ();
			setVisible (false);
			frame.setVisible(false);
			
		}
```


----------



## The_S (1. Feb 2007)

du musst dein Frame als Klassenvariable definieren  .


----------



## epimetheus_xxx (1. Feb 2007)

Hab ich getan, und es kommt auch keine Fehlermeldung mehr, aber das Fenster schliesst trotzdem nicht.



```
public class Hohlzylinder extends JFrame implements ActionListener
{
	// Variablendeklaration
	
	private JFrame frame;
```

Muss ich das Frame jetzt noch dem ActionListener übergeben? Mit der folgenden Codezeile geht es schonmal nicht


```
frame.addActionListener ();
```


----------



## The_S (1. Feb 2007)

Ne, das hat nix mit dem ActionListener zu tun. Scheinbar haste irgendwo anders n Fehler. Ich poste dir mal n Beispiel:


```
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyFrame extends JFrame implements ActionListener{

	private static final long serialVersionUID = 1L;
	
	private JFrame frame = null;
	private JButton button = null;
	
	public MyFrame() {

		frame = new JFrame("Neues Fenster");
		frame.setSize(400, 400);
		button = new JButton("Auf");
		button.addActionListener(this);
		setLayout(new FlowLayout());
		add(button);
		pack();
	}

	public void actionPerformed(ActionEvent evt) {
		
		if (evt.getSource() == button) {
			if (button.getText().equals("Auf")) {
				frame.setVisible(true);
				button.setText("Zu");
			}
			else {
				frame.setVisible(false);
				button.setText("Auf");
			}
		}
	}

	public static void main(String[] args) {
		new MyFrame().setVisible(true);
	}
}
```


----------



## Tobias (1. Feb 2007)

Da Hohlzylinder sowohl Frame als auch ActionListener ist, schreibst du einfach this.dispose() in die actionPerformed().

mpG
Tobias


----------



## epimetheus_xxx (1. Feb 2007)

Danke für das Beispiel. Nur im Beispiel wird das Frame in einem Konstruktor deklariert, bei mir befindet sich das Fenster aber in einer Methode. Oder ist das egal?


----------



## The_S (1. Feb 2007)

Ob Methode oder Kunsturkor ist egal. Hauptsache dein Frame ist eine Klassenvariable


----------



## epimetheus_xxx (1. Feb 2007)

Tut mir echt leid, aber ich steig da nicht hinter, hier nochmal der relevante Quellcode.


```
public class Hohlzylinder extends JFrame implements ActionListener
{
	// Variablendeklaration

	private JFrame frame;
	
	// Konstruktor
	public Hohlzylinder ()
	{
		
		Hohlzylinderbild ();
	}
	
	// Methode
	public void Hohlzylinderbild ()
	{
		// Fenstereigenschaften und einfügen eines Bildes
			JFrame frame = new JFrame ("Hohlzylindervariablen");
			frame.setDefaultCloseOperation (JFrame.HIDE_ON_CLOSE);
			ImageIcon bild = new ImageIcon (Hohlzylinder.class.getResource ("Hohlzylinder.jpg"));
			JLabel Pic = new JLabel (bild);
			frame.getContentPane ().add (Pic,BorderLayout.CENTER);
			frame.setLocation (50, 400);
			frame.pack ();
			frame.setVisible (true);
	}
	

	// Action Methode
	public void actionPerformed (final ActionEvent a)
	{	
	
		// Sprung zurück in die Klasse Rund
		if (a.getActionCommand ().equals ("Zurück"))
		{
			Rund b = new Rund ();
			setVisible (false);
			frame.setVisible(false);
		}
		
	}
}
```


----------



## The_S (1. Feb 2007)

Setz mal dein Hohlzylindervariablen-JFrame vor deinem Hohlzylinder-JFrame auf visible(false)


----------



## epimetheus_xxx (1. Feb 2007)

Klappt auch nicht.


```
public void actionPerformed (final ActionEvent a)
	{	
	
		// Sprung zurück in die Klasse Rund
		if (a.getActionCommand ().equals ("Zurück"))
		{
			Rund b = new Rund ();
			frame.setVisible(false);
			setVisible (false);	
		}
```


----------



## The_S (1. Feb 2007)

Von wo aus wird denn der ActionListener überhaupt aufgerufen (fällt mir dabei grad so auf)?


----------



## epimetheus_xxx (1. Feb 2007)

Im Konstruktor Hohlzylinder. Oder was meinst du?


```
// Einbinden der Buttons in den ActionListener
		zurueck.addActionListener (this);
		beenden.addActionListener (this);
		berechnena.addActionListener (this);
		tfd1.addActionListener (this);
		tfd2.addActionListener (this);
		tfh.addActionListener (this);
```


----------



## The_S (1. Feb 2007)

Springt er denn überhaupt hier rein? 


```
if (a.getActionCommand ().equals ("Zurück"))
      { 
}
```


----------



## Azrahel (1. Feb 2007)

epimetheus_xxx hat gesagt.:
			
		

> Tut mir echt leid, aber ich steig da nicht hinter, hier nochmal der relevante Quellcode.
> 
> 
> ```
> ...



Äh da beisst sich doch was  ???:L Meiner Meinung nach passt das nicht, da müsste doch in der actionPerformed ne NUll-Pointer-ex fliegen oder?

Lass mal das Frame bei 
	
	
	
	





```
JFrame frame = new JFrame ("Hohlzylindervariablen");
```
 weg.


----------



## The_S (1. Feb 2007)

Wäre vielleicht mal sinnvoll das KOMPLETTE Programm zu sehen und net nur Ausschnitte wo hier oder da mal was weggelassen wurde.


----------



## Azrahel (1. Feb 2007)

DAS wäre ja mal die Idee 

Wobei ich eigentlich schon nix mehr seh, ich hab seit 3 Tagen nicht geschlafen und hab schon Probleme die richtigen Tasten zu treffen :?


----------



## epimetheus_xxx (1. Feb 2007)

So hier nochmal der Komplette Quell Code.


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

public class Hohlzylinder extends JFrame implements ActionListener
{
	// Variablendeklaration
	private JFormattedTextField tfd1;
	private JFormattedTextField tfd2;
	private JFormattedTextField tfh;
	private double durchmesser1;
	private double durchmesser2;
	private double hoehe;
	private JFrame frame;
	
	// Konstruktor
	public Hohlzylinder ()
	{
		// Fenstereigenschaften
		super ("gerader Hohlzylinder");
		setSize (800, 400);
		setLayout (new GridLayout (6, 1));
		
		// Panels
		JPanel titel = new JPanel ();
		JPanel durchmesser1 = new JPanel ();
		JPanel durchmesser2 = new JPanel ();
		JPanel hoehe = new JPanel ();
		JPanel berechnen = new JPanel ();
		JPanel button = new JPanel ();
		
		// Panelhintergrund
		titel.setBackground (Color.yellow);
		durchmesser1.setBackground (Color.cyan);
		durchmesser2.setBackground (Color.cyan);
		hoehe.setBackground (Color.cyan);
		berechnen.setBackground (Color.cyan);
		button.setBackground (Color.red);
		
		// Labels
		JLabel titela = new JLabel ("Stereometrie");
		JLabel durchmesser1a = new JLabel ("Durchmesser d_1:");
		JLabel durchmesser2a = new JLabel ("Durchmesser d_2:");
		JLabel hoehea = new JLabel ("Höhe h:");
		
		// Labeleigenschaften
		titela.setFont(new Font ("SansSerif", Font.PLAIN,40));
		durchmesser1a.setFont (new Font( "SansSerif", Font.PLAIN,20));
		durchmesser2a.setFont (new Font ("SansSerif", Font.PLAIN,20));
		hoehea.setFont (new Font ("SansSerif", Font.PLAIN,20));
		
		// Buttons
		JButton zurueck = new JButton ("Zurück");
		JButton beenden = new JButton ("Programm beenden");
		JButton berechnena = new JButton ("Berechnen");
		
		// Textfeld
		tfd1 = new JFormattedTextField ();
		tfd2 = new JFormattedTextField ();
		tfh = new JFormattedTextField ();
		tfd1.setColumns (20);
		tfd2.setColumns (20);
		tfh.setColumns (20);
		
		// Belegung der Panels
		titel.add (titela);
		durchmesser1.add (durchmesser1a);
		durchmesser1.add (tfd1);
		durchmesser2.add (durchmesser2a);
		durchmesser2.add (tfd2);
		hoehe.add (hoehea);
		hoehe.add (tfh);
		berechnen.add (berechnena);
		button.add (zurueck);
		button.add (beenden);
		
		// Einfügen der Panels
		add (titel);
		add (durchmesser1);
		add (durchmesser2);
		add (hoehe);
		add (berechnen);
		add (button);
		
		// Sichtbarkeit des Fensters
		setVisible (true);
		
		// Einbinden der Buttons in den ActionListener
		zurueck.addActionListener (this);
		beenden.addActionListener (this);
		berechnena.addActionListener (this);
		tfd1.addActionListener (this);
		tfd2.addActionListener (this);
		tfh.addActionListener (this);
		
		Hohlzylinderbild ();
	}
	
	// Methode
	public void Hohlzylinderbild ()
	{
		// Fenstereigenschaften und einfügen eines Bildes
			JFrame frame = new JFrame ("Hohlzylindervariablen");
			frame.setDefaultCloseOperation (JFrame.HIDE_ON_CLOSE);
			ImageIcon bild = new ImageIcon (Hohlzylinder.class.getResource ("Hohlzylinder.jpg"));
			JLabel Pic = new JLabel (bild);
			frame.getContentPane ().add (Pic,BorderLayout.CENTER);
			frame.setLocation (50, 400);
			frame.pack ();
			frame.setVisible (true);
	}
	

	// Action Methode
	public void actionPerformed (final ActionEvent a)
	{	
	
		// Sprung zurück in die Klasse Rund
		if (a.getActionCommand ().equals ("Zurück"))
		{
			Rund b = new Rund ();
			frame.setVisible(false);
			setVisible (false);	
		}
		
		// Programm beenden
		if (a.getActionCommand ().equals ("Programm beenden"))
		{
			System.exit(0);
		}
		
		// Aufrufen der internen Klasse Hohlzylinderbe und auslesen der Textfelder
		if (a.getActionCommand ().equals ("Berechnen"))
		{
			durchmesser1 = Double.parseDouble (tfd1.getText ());
			durchmesser2 = Double.parseDouble (tfd2.getText ());
			hoehe = Double.parseDouble (tfh.getText ().replace(',', '.'));
			Hohlzylinderbe c = new Hohlzylinderbe (this, true, durchmesser1, durchmesser2, hoehe);
			c.setVisible (true);
			return;
		}
	}
}
	
// Klasse Hohlzylinderberechnung
class Hohlzylinderbe extends JDialog
{
	// Variblendeklaration
	private double phi = 3.1416;
	private double A_O;
	private double A_M;
	private double V;
	private double durchmesser1;
	private double durchmesser2;
	private double hoehe;
	private JLabel label1;
	private JLabel label2;
	private JLabel label3;
	
	// Konstruktor
	public Hohlzylinderbe (final Frame parent, final boolean modal,
	final double durchmesser1,
	final double durchmesser2,
	final double hoehe)
	{
		super (parent, "geraden Hohlzylinder berechnen", modal);
		
		// Übernehmen der Variablen
		this. durchmesser1 = durchmesser1;
		this. durchmesser2 = durchmesser2;
		this.hoehe = hoehe;
		
		// Labels
		label1 = new JLabel ("");
		label2 = new JLabel ("");
		label3 = new JLabel ("");
		
		// Einfügen der Labels und Layout
		add (label1, BorderLayout.NORTH);
		add (label2, BorderLayout.CENTER);
		add (label3, BorderLayout.SOUTH);
		
		// Eigenschaften Dialogfenster
		setSize (300,200);
		this.getContentPane ().setBackground (Color.cyan);
		setLocationRelativeTo (parent);
		
		berechnen();
	}
	
	// Methode Berechnung
	private void berechnen()
	{
		// Berechnung
		A_M = phi * hoehe * (durchmesser1 + durchmesser2);
		A_O = (phi / 2) * (durchmesser2 + durchmesser1) * ((2 * hoehe) + durchmesser2 - durchmesser1);
		V = (phi / 4) * hoehe * ((durchmesser2 * durchmesser2) - (durchmesser1 * durchmesser1)); 
		
		// Labels beschreiben
		label1.setText (" Oberfläche: "+A_O);
		label2.setText (" Mantelfläche: "+A_M);
		label3.setText (" Volumen: "+V);
	}
}
```



> Äh da beisst sich doch was  Meiner Meinung nach passt das nicht, da müsste doch in der actionPerformed ne NUll-Pointer-ex fliegen oder?
> 
> Lass mal das Frame bei  Code:
> 
> ...


Das hatte ich auch schon probiert.


----------



## The_S (1. Feb 2007)

Du musst in deiner Hohlzylinderbild-Methode (Methodennamen schreibt man btw klein) die Zeile 
	
	
	
	





```
JFrame frame = new JFrame ("Hohlzylindervariablen");
```

in 
	
	
	
	





```
frame = new JFrame ("Hohlzylindervariablen");
```

umändern.

Für die Zukunft ist es nützlich, wenn du uns auch Fehler, die auftreten, mitteilst  .


----------



## epimetheus_xxx (1. Feb 2007)

Es traten ja keine Fehler auf. Aber jetzt geht es. Danke Euch!


----------



## The_S (1. Feb 2007)

Also als ich das kompiliert und ausgeführt habe, kam es zu ner NullPointerException wegen dem JFrame ...


----------



## epimetheus_xxx (1. Feb 2007)

Bei mir kommt nix. Ich benutze JOE. Naja geht ja jetzt, Danke nochmal.


----------

