# RadioButton nicht änderbar stellen, ohne das Sie grau wird



## CLSK (25. Jul 2008)

Moin,
ich möchte ein Radio Button und eine CheckBox nicht mehr editierbar stellen.
Allerdings möchte ich nicht das die Komponenten grau werden, wie es bei setEnabled(false) der Fall währe.
Hat jemand nen plan dafür? oder geht das nicht. 
Gruß
CLSK


----------



## Marco13 (25. Jul 2008)

Man könnte einen ganz normalen Listener dranhängen, der sie wieder disabled (mit einem Flag endlos-Aufrufe verhindern). Allerdings ist das IMHO grunsätzlich Humbug. Entweder man kann sie auswählen, oder nicht. Es gibt bestimmte Erwartungshaltungen. Wenn ich so eine nicht-auswählbare (aber nicht ausgegraute) Checkbox erleben würde, würde ich unumwunden sagen, dass der Programmierer da einen Bug eingebaut hat. Dass er sowas _absichtlich_ macht, wäre mir _eigentlich_ nicht in den Sinn gekommen, aber.... man lernt nie aus :roll:


----------



## CLSK (25. Jul 2008)

ja das mag sein,
habe allerdings in diesem Fall eine Programmseite (es werden auf der Seite lediglich Informationen dargestellt) in der dann bis auf die CheckBox bzw RadioButton alles in normaler Farbe ist. Da währen graue CheckBox bzw RadioButton eher verwirrend.

Den Listener werde ich wohl oder übel nehmen müssen, wenn es keine andere Lösung gibt.

Vielen Dank an Marco13

MfG
CLSK


----------



## Gast2 (25. Jul 2008)

Du kannst die normale Farbe von deinen Komponenten in einem Objekt speichern und die setEnable bzw. set Editable überschreiben und dort die normal farbe wieder setzen...


----------



## Verjigorm (25. Jul 2008)

Stichwort: GlassPane

je nach Komplexität der GUI aber eher viel Aufwand


----------



## Marco13 (25. Jul 2008)

Nicht unbedingt: Wenn man eine GUI mit 1000 CheckBoxes, Buttons, usw. hat, und die NUR angezeigt werden soll (d.h. wenn keine Interaktion möglich sein soll) dann klatscht man pauschal eine große GalssPane drüber, und schon kommen keine Events mehr bei den CheckBoxes an.... Wäre einfach, effizient und (für diesen Zweck) eleganter, als irgendwelche Listener-Hacks....


----------



## CLSK (25. Jul 2008)

eine dumme frage habe ich dann doch noch..
habe folgendes versucht

1. Habe die Farbe zwischengespeichert mit getColorModel, dann das Ding setEnabled(false) gesetzt, nur dann habe ich leider keine "setColorModel" Funktion gefunden.


2. (dann kam Plan B) den Button bzw. Box setEnabled(false) setzten, und mit setBackground(new java.awt.Color(236,232,216)) und setForeground(new java.awt.Color(0,0,0)) die Farben anpassen. Dummerweise bleibt bei dieser Methode der Kasten für den Harken grau.

Von GlassPane habe ich leider noch nie was gehört. 

Hat vll. jemand zu Möglichkeit 1(Methode zum Farbesetzen) oder Möglichkeit 2(Methode zum Farbesetzen des Hakens) einen Lösungsvorschlag.

Ne Listenervergewaltigung würde ich doch ganz gerne bleiben lassen.

Mit freundlichen Grüßen 
CLSK


----------



## Marco13 (25. Jul 2008)

Das mit den Farben ist ein VIEL üblerer ack als das mit den Listenern. Egal, welche Farben du setzt: Mit anderem Look&Feel (oder anderem Betriebssystem) wird da unfug rauskommen. Zur GlassPane: http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html


----------



## kleiner_held (25. Jul 2008)

Mann kann auch eine eigenes ButtonModel verwenden und bei diesem die Aenderung des selected Status verhindern.


```
public class RBTest
{
	public static void main(String[] args)
	{
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		LockableButtonModel model1 = new LockableButtonModel();
		model1.setSelected(true);
		model1.setLocked(true);
		LockableButtonModel model2 = new LockableButtonModel();
		model2.setSelected(true);
		model2.setLocked(true);
		JRadioButton radioButton = new JRadioButton("Test");
		JCheckBox checkBox = new JCheckBox("Test");
		radioButton.setModel(model1);
		checkBox.setModel(model2);
		frame.add(radioButton, BorderLayout.CENTER);
		frame.add(checkBox, BorderLayout.SOUTH);
		frame.pack();
		frame.setVisible(true);
	}
	
	private static class LockableButtonModel extends DefaultButtonModel
	{
		private boolean locked;

		public boolean isLocked()
		{
			return locked;
		}

		public void setLocked(boolean locked)
		{
			this.locked = locked;
		}
		
		@Override
		public void setSelected(boolean b)
		{
			if (!isLocked())
			{
				super.setSelected(b);
			}
		}
	}
}
```


----------



## Gast2 (25. Jul 2008)

irgendwie macht die ganze Aufgabe keinen Sinn aber du kannst auch einfach setEnabled überschreiben


```
setEnabled(boolean b)
{
setSelected(true);
}
```

dann bleibt der button für immer angehakt und man kann nichts damit machen...

und wenn es dir nicht gefällt dass er beim klicken doch so aussieht als ob er noch was tut 
kannst die ganez Icons noch überschreiben rollovericon, pressedicon usw.

aber ich glaube auch eine glasspane wäre schon praktischer...


----------

