# JButton nach Klick ausblenden



## _12Thesaurus (15. Nov 2014)

Hallo Java-Freunde,

ich bin ein absoluter Java Neuling und wollte mir die Grundlagen eigentlich im Selbststudium mit dem Buch "Programmieren lernen mit Java" von Hans-Peter Habelitz beibringen, aber bei den graphischen Oberflächen arbeitet das Buch mit Jigloo, welches anscheinend zum download nicht mehr zur Verfügung steht. Die GUIS (?) erzeuge ich nun mit dem WindowBuilder von Eclipse, aber die Befehle aus dem Buch kann ich nicht 1 zu 1 übernehmen (oder ich bin zu blöd dafür). Ich habe jetzt das Problem, dass ich ein JButton nach betätigen von diesem verschwinden lassen wollte. Das funktioniert aber nicht und ich weiß nicht warum. Ich habe mal ein Minimalbeispiel geschrieben (dabei ist mir wichtig, dass das Verschwinden in einer Methode passiert). Ich habe in der Methode "verschwinde()" einige Befehle reingeschrieben, die ich schon probiert habe.
Falls der Code "schlechten Stil" enthält, weist mich gern darauf hin.

Im Voraus schon mal Danke!
LG


```
package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class test extends JFrame {

	public JPanel contentPane;
	public JButton btn_verschwinde;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					test frame = new test();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public test() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btn_verschwinde = new JButton("Klick mich");
		btn_verschwinde.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				verschwinde();
			}
		});
		btn_verschwinde.setBounds(170, 83, 119, 23);
 		contentPane.add(btn_verschwinde);
		btn_verschwinde.setVisible(true);
		
		
	}
	
	public void verschwinde() {
		contentPane.remove(btn_verschwinde);
		contentPane.repaint();
		btn_verschwinde.setVisible(false);
	}
}
```


----------



## kaoZ (15. Nov 2014)

Tip Nr. 1 :

   - Finger weg von Gui Buildern, solange keine Verständnis für Layoutmanager / API vorliegt.

Tip Nr. 2 : 

   - Blende den Button doch einfach aus ?! und bei bedarf einfach wieder ein

Tip Nr. 3 : 

   - Gewöhne dir an möglichst in einer Sprache zu programmieren, vorzugsweise in der, welche auch in den API's
     verwendet wird, sprich Englisch.

Tip Nr. 4 : 

   - Gewöhne dir garnicht erst an NULL Layouts zu verwenden, ausser wenn wirklich kein Layoutmanager deine erwartungen erfüllt,

```
contentPane.setLayout(null);
```
 Null-Layouts sind starr und unflexibel, dann nimm dir lieber die Zeit und arbeite dich      
     vernünftig in die Grundlegenden Manager ein 


```
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Foo extends JPanel{

	JButton btn;
	
	public Foo(){
		setPreferredSize(new Dimension(250,250));
		btn = new JButton("Klick mich");
		add(btn);
		btn.addActionListener(e -> btn.setVisible(false));  // Java 8 (Lambda) <<--
	}
	
	public static void main(String[] args){
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		f.setContentPane(new Foo());
		f.pack();
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}
}
```

Gehe hier nochmal schritt für schritt durch und überlege warum das nicht funktionieren könnte :


```
contentPane.remove(btn_verschwinde);  // <<-- Tip
contentPane.repaint();
btn_verschwinde.setVisible(false);
```


----------



## _12Thesaurus (15. Nov 2014)

Hi kaoZ,

danke für deine ausführliche Antwort. 
Dein Beispielcode konnte ich leider nicht starten, weil ich anscheinend Java 1.7 verwende.

Allgemein zu deinen Anmerkungen: Wie ich schon schrieb, arbeite ich mich durch das Buch durch und muss zunächst darauf vertrauen, dass der Autor schon weiß, wovon er spricht (ich kann die Qualität des Buches als Neuling ja nicht beurteilen) und wenn im Buch nun die Builder behandelt werden, dann geh ich davon aus, dass man das mit dem vorher erarbeiteten Wissen auch tun kann. Es ist nun ja nicht so, dass ich die vorherigen Kapitel übersprungen hätte. Die NULL Layouts sind auch nicht auf meinem Mist gewachsen, sondern stammen aus dem Buch (der Autor hat dazu nur angemerkt, dass die Bedeutung von NULL an dieser Stelle später behandelt wird und es was mit der "Reihenfolge" bzw. Priorität der Fenster zu tun hat).
Jetzt noch etwas spezieller zu
Tip Nr. 2:
Ich dachte ja, dass ich das mit btn_verschwinde.setVisible(false) einfach tue, weil es so in der Musterlösung vom Buch steht.
Tip Nr. 3:
Stimmt natürlich und ich hatte ja auch ausdrücklich darauf hingewiesen, mich auf schlechten Stil aufmerksam zu machen. 
Tip Nr. 4:
Was meinst du genau damit, dass ich mich in die grundlegenden Manager einarbeiten soll? Ist mit Manager z.B. der WindowBuilder gemeint?
Bei deinem Tip ich solle mir die Zeile
contentPane.remove(btn_verschwinde);
noch mal genauer ansehen, steh ich total auf dem Schlauch. Zugegebenermaßen habe ich das auch nur deswegen ausprobiert, weil ich das auf der Suche im Netz nach einer Lösung irgendwo gelesen habe und unreflektiert übernommen habe.

LG


----------



## Foxei (16. Nov 2014)

Layout Manager sind Fenster Layouts die Automatisch für dich die Componenten an die Richtige stelle rücken. Java selber stellt einige von Haus aus zur Verfügung. 
https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Zu deinem Verschwinde Button mit 
	
	
	
	





```
setVisible(false)
```
 wird der Button unsichtbar. Wenn das deine einzige Intention ist ist diese Lösung vollkommen ausreichend.

Allerdings muss ich kaoZ zustimmen das ein Absolutes Layout nur im absolut letzten Fall eingesetzt wird.
Zum Code von kaoZ unter Java 7 sieht er so aus:

```
import java.awt.Dimension;
	import javax.swing.JButton;
	import javax.swing.JFrame;
	import javax.swing.JPanel;
	 
	public class Foo extends JPanel{
	 
		JButton btn;
	 
		public Foo(){
			setPreferredSize(new Dimension(250,250));
			btn = new JButton("Klick mich");
			add(btn);
			btn.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent arg0) {
					btn.setVisible(false);
				}
			}); 
		}
	 
		public static void main(String[] args){
			JFrame f = new JFrame();
			f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			f.setContentPane(new Foo());
			f.pack();
			f.setLocationRelativeTo(null);
			f.setVisible(true);
		}
	}
```


----------



## _12Thesaurus (16. Nov 2014)

Hallo Foxei,

danke für die Aufklärung mit dem Manager.

Deinen geänderten Programmcode kann ich mit Eclipse nicht starten. Die erste Fehlermeldung von Eclipse kommt schon in Zeile 6 mit "The serializable class does not declare a static final serialVersionUID field". Nach Einfügen von

```
private static final long serialVersionUID = 1L;
```
ist dieser Fehler zwar weg, aber dann sind noch Fehlermeldungen in Zeile 14 und 17. Aber eigentlich will ich ja keinen anderen Code haben, der das tut, was meiner tun soll, sondern wissen, warum meiner nicht das tut, was er tun soll.

Du schreibst mit

```
setVisible(false);
```
verschwindet der Button. Aber genau das steht doch in meinem Code. Der Button verschwindet aber gerade nicht. Ich kann das Programm ausführen und auf den Button klicken und er ist immer noch da.
Vielleicht hätte ich schon in meinem ersten Post die folgende Meldung aus der Console posten sollen:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at gui.test.verschwinde(test.java:60)
	at gui.test$2.actionPerformed(test.java:49)
	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.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(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)

LG


----------



## Foxei (16. Nov 2014)

Ach so  das ist ganz einfach du initialisierst deine Button Variable nicht. Dadurch das du schreibst 
	
	
	
	





```
JButton btn_verschwinden=new JButton();
```
 beschränkt sich dieser JButton auf die Methode in diesem fall kannst du den Button nur aus dem Konstruktor ansteuern. Um deine Variabele die Oben steht zu initialisieren muss es nur 
	
	
	
	





```
btn_verschwinden=new JButton();
```
 heißen. 
Dein Code in funktionierend wäre so:

```
package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
 
public class test extends JFrame {
 
	public JPanel contentPane;
	public JButton btn_verschwinde;
 
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					test frame = new test();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
 
	/**
	 * Create the frame.
	 */
	public test() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
 
		btn_verschwinde = new JButton("Klick mich");
		btn_verschwinde.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				verschwinde();
			}
		});
		btn_verschwinde.setBounds(170, 83, 119, 23);
 		contentPane.add(btn_verschwinde);
		btn_verschwinde.setVisible(true);
 
 
	}
 
	public void verschwinde() {
		contentPane.remove(btn_verschwinde);
		contentPane.repaint();
		btn_verschwinde.setVisible(false);
	}
}
```


----------



## _12Thesaurus (16. Nov 2014)

Super, es funktioniert . Vielen Dank! Ich war schon am verzweifeln, weil ich seit gestern nach einer Lösung suche.


----------

