java: fenster über button schließen

vOerni

Ensign
Registriert
Jan. 2008
Beiträge
146
hallo allerseits,

kann einer mir sagen, was an dem quellcode falsch, so dass ich über den button das fenster nicht schließen kann.


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

class Panel extends JPanel
	implements ActionListener
{	public Panel()
	{	closeAllButton = new JButton("Schliessen");
		add(closeAllButton);
		closeAllButton.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent evt)
	{	SimpleFrame f = new SimpleFrame();
		closeAllButton.addActionListener(f);
	}
	
	private JButton closeAllButton;
}

class FirstFrame extends JFrame
{	public FirstFrame()
	{	setBounds (790, 612, 300, 200);
		setTitle("Schaltfläche");
		addWindowListener (new WindowAdapter()
		{	public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		}  );
		Container contentPane = getContentPane();
		contentPane.add(new Panel());
	}
}

public class GrafikButton
{	public static void main (String [] args)
	{	JFrame frame = new FirstFrame();
		frame.show();
	}
}

class SimpleFrame extends JFrame
	implements ActionListener
{	public void actionPerformed(ActionEvent evt)
	{	
		dispose();
	}
}

und beim compilieren erscheint noch:
Note: GrafikButton.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

was ist damit gemeint?

p.s. hab erst mit java angefagen

danke für eure hilfe
 
Also zu der Warnung erstmal: Du machst das Fenster mit show() sichtbar. Das ist veraltet, du solltest setVisible(true) benutzen.

Der Button macht das Fenster nicht zu, weil sich die dispose()-Anweisung auf den SimpleFrame bezieht, und nicht auf den FirstFrame (falls das so gewollt war). Ich finde das sowieso sehr konfus. Wann immer du auf "Schließen" klickst, fügst du einen neuen ActionListener hinzu. Wenn du 10 mal auf den Button klickst, hast du dann 10 ActionListener hinzugefügt, die alle ein sowieso nicht sichtbares Fenster schließen.
 
das mit setVisible hat wunderbar geklappt, danke.

wo muss das dispose jetzt genau hin, denn ich krieg andauernd ne fehlermeldung.
den letzen teil hab ich jetzt weggelassen, das mit dem SimpleFrame
 
Also du willst ja mit dem Button das Hauptfenster schließen, also muss im ActionListener dieses Fenster auch bekannt sein. Wie du das nun exakt anstellst, darüber kann man sich streiten.

Du könntest dem Panel das Vaterfenster an den Konstruktor übergeben:

Code:
class Panel extends JPanel
	implements ActionListener
{	public Panel(JFrame frame)
	{	
		owner = frame;
		closeAllButton = new JButton("Schliessen");
		add(closeAllButton);
		closeAllButton.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent evt)
	{	owner.dispose();
	}
	
	private JFrame owner;
	private JButton closeAllButton;
}

Und im FirstFrame heißt es dann nicht
Code:
contentPane.add(new Panel());

sondern
Code:
contentPane.add(new Panel(this));
, um nur eine Möglichkeit zu nennen. Einfacher wäre das vielleicht, wenn das Panel eine Subklasse von FirstFrame wäre.

Achja: Gaaaanz schlecht, dass du deine eigene Klasse "Panel" nennst. Die Klasse Panel gibt es bereits in awt, und das Paket importierst du ja sogar. Bitte umbenennen :)
 
ok danke,
hab noch ne weitere möglichkeit gefunden

Code:
class FirstPanel extends JPanel
	implements ActionListener
{	public FirstPanel()
	{	JButton closeAllButton = new JButton("Schliessen");
		add(closeAllButton);
		closeAllButton.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent evt)
	{	
		System.exit(0);
	}

	private JButton closeAllButton;
}
 
Naja, es macht schon einen Unterschied ob du nur ein einziges Fenster schließen willst oder das gesamte Programm über System.exit() mit der Holzhammermethode gewaltsam abbrichst.
 

Ähnliche Themen

Zurück
Oben