# JPanel.setEnabled(false); auf Kindelemente funzt net?



## Oli (13. Mrz 2008)

Hi,

bei JPanel.setEnabled(false) würde ich erwarten, dass alle Kindelemente, die dem Panel liegen nicht mehr funktionsfähig (ausgegraut) sind. Dies ist aber nicht der Fall, muss ich wirklich jedes einzelne Element ansprechen und en/disablen?

Grüße Oli


----------



## SlaterB (13. Mrz 2008)

ja,
codetechnisch:
du schreibst dir eine Rekursion, die alle KindKompoenten durchläuft und diese dann disabled


----------



## Niki (13. Mrz 2008)

Schreib dir eine rekursive Methode die das macht. Mit JComponent#getComponents() kannst du die Child-Elemente ermitteln. Ich glaub auf die JComboBox musst du aber extra abfragen mit instanceof, weil das eigentlich eine Komponente ist und aber aus zwei besteht.


----------



## Oli (13. Mrz 2008)

Hi,

des is aber net schön. Ich bin zwar immer mehr von Java angetan, aber des ist in C# schöner gelöst....

Nun gut, dann zaubern wir halt ein bisschen...


Grüße Oli.


----------



## SlaterB (13. Mrz 2008)

noch schöner wirds, wenn du überhaupt nicht Swing nimmst, setze nicht Swing mit Java gleich 
(nicht allzu ernst gemeint)


----------



## Niki (13. Mrz 2008)

Aja noch ein Hinweis. Wenn du eine enableAll Methode schreibst, musst du dir vorher den Status der einzelnen Komponenten merken. Du willst ja nicht dass eine Komponente, die vorher disabled war, auf einmal enabled ist. Also brauchst du einen StateHolder (HashMap würde sich anbieten)

Könnte ca. so aussehen:

```
import java.awt.Component;
import java.util.HashMap;
import java.util.Map.Entry;

import javax.swing.JComboBox;
import javax.swing.JComponent;

public class GuiFreezer {

	private JComponent component = null;

	private HashMap<JComponent, Boolean> stateHolder = null;

	public GuiFreezer(JComponent component) {
		this.component = component;
		this.stateHolder = new HashMap<JComponent, Boolean>();
	}

	public void freeze() {
		_freezeRec(component);
	}

	public void unFreeze() {
		for (Entry<JComponent, Boolean> e : stateHolder.entrySet()) {
			JComponent c = e.getKey();
			c.setEnabled(e.getValue());
		}
	}

	private void _freezeRec(JComponent c) {
		if (c instanceof JComboBox || c.getComponentCount() == 0) {
			boolean state = c.isEnabled();
			c.setEnabled(false);
			stateHolder.put(c, state);
		} else {
			Component[] children = c.getComponents();
			for (Component child : children) {
				_freezeRec((JComponent) child);
			}
		}
	}
}
```


----------



## Oli (13. Mrz 2008)

Hallo Niki,

hab mir das überlegt:


```
private void setEnabled(Component compToEnOrDisable, boolean enabled)
	{
		compToEnOrDisable.setEnabled(enabled);
		if (compToEnOrDisable instanceof Container)
		{
			Container cont = (Container)compToEnOrDisable;
			int count = cont.getComponentCount();
			for (int i = 0; i < count; i++)
			{
				setEnabled(cont.getComponent(i), enabled);
			}
		}
	}
```


reicht völlig aus....


Grüße Oli


----------

