JFrame schließen, Kommazahlen einlesen

Status
Nicht offen für weitere Antworten.
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.


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;
	
	// 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

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

The_S

Top Contributor
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

Top Contributor
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.)

Code:
double dbl = Double.parseDouble(textfeld.getText().replace(',', '.'));
 
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

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

Code:
jframe.setVisible(false);
jdialog.dispose();
 
Okay, aber wenn ich den Befehl im ActionListener so eingebe kommt eine Fehlermeldung das die Variable frame nicht zu finden sei.

Code:
	// 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);
			
		}
 
Hab ich getan, und es kommt auch keine Fehlermeldung mehr, aber das Fenster schliesst trotzdem nicht.


Code:
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

Code:
frame.addActionListener ();
 

The_S

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

Code:
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

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

mpG
Tobias
 
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?
 
Tut mir echt leid, aber ich steig da nicht hinter, hier nochmal der relevante Quellcode.

Code:
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

Top Contributor
Setz mal dein Hohlzylindervariablen-JFrame vor deinem Hohlzylinder-JFrame auf visible(false)
 
:( Klappt auch nicht.

Code:
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

Top Contributor
Von wo aus wird denn der ActionListener überhaupt aufgerufen (fällt mir dabei grad so auf)?
 
Im Konstruktor Hohlzylinder. Oder was meinst du?

Code:
// 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

Top Contributor
Springt er denn überhaupt hier rein?

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

Azrahel

Bekanntes Mitglied
epimetheus_xxx hat gesagt.:
Tut mir echt leid, aber ich steig da nicht hinter, hier nochmal der relevante Quellcode.

Code:
public class Hohlzylinder extends JFrame implements ActionListener
{
	// Variablendeklaration

	private JFrame frame; [color=red]//Hier wird ein privates deklariert[/color]
	
	// Konstruktor
	public Hohlzylinder ()
	{
		
		Hohlzylinderbild ();
	}
	
	// Methode
	public void Hohlzylinderbild ()
	{
		// Fenstereigenschaften und einfügen eines Bildes
			JFrame frame = new JFrame ("Hohlzylindervariablen"); [color=red]//hier wird noch eins declariert[/color]
			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);[color=red]//Die Klassenvariable frame müsste an der Stelle NULL sein[/color]
		}
		
	}
}

Ä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
Code:
JFrame frame = new JFrame ("Hohlzylindervariablen");
weg.
 

The_S

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

Azrahel

Bekanntes Mitglied
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 :?
 
So hier nochmal der Komplette Quell Code.

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:

1


JFrame frame = new JFrame ("Hohlzylindervariablen");


weg.
Das hatte ich auch schon probiert.
 

The_S

Top Contributor
Du musst in deiner Hohlzylinderbild-Methode (Methodennamen schreibt man btw klein) die Zeile
Code:
JFrame frame = new JFrame ("Hohlzylindervariablen");

in
Code:
frame = new JFrame ("Hohlzylindervariablen");

umändern.

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

The_S

Top Contributor
Also als ich das kompiliert und ausgeführt habe, kam es zu ner NullPointerException wegen dem JFrame ...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben