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

Status
Nicht offen für weitere Antworten.

Oli

Top Contributor
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
 
ja,
codetechnisch:
du schreibst dir eine Rekursion, die alle KindKompoenten durchläuft und diese dann disabled
 
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.
 
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.
 
noch schöner wirds, wenn du überhaupt nicht Swing nimmst, setze nicht Swing mit Java gleich 😉
(nicht allzu ernst gemeint)
 
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:
Code:
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);
			}
		}
	}
}
 
Hallo Niki,

hab mir das überlegt:

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

Zurück
Oben