# JButton mit Icon



## blaues_etwas (21. Nov 2007)

Hallo,
ich brauch für mein Programm einen Button, weiß aber nicht so recht, wie ich diesen programmieren soll, damit dieser funktioniert. Meine Überlegung wäre, da ich mit Swing arbeite, den JToggleButton zu benutzen, da dieser zwei Zustände einnehmen kann. Einmal gedrückt und mal nicht gedrückt. Mit Swing kann ich den Buttons auch noch Icons verpassen. Mein Button soll mit einem Icon ohne Text deklariert werden. Beim Drücken dieses Buttons soll sich aber das Icon verändern, das nur einen Farbwechsel darstellen soll. Der Button soll nur ein einziges mal gedrückt werden, also von "nicht gedrückt" zu "gedrückt". Der Zustand müsste in einer Hilfsvariablen deklariert werden.
Von diesem Typ Button möchte ich gleich mehrere in meinem Programm verwenden.

Bin für Tipps sehr dankbar.


----------



## blaues_etwas (21. Nov 2007)

Den Iconwechsel hab ich nun selbst gelöst. Die Methode klingt logisch, aber ich bin erst nach sehr langem suchen in der API fündig geworden.

```
element.setIcon();
```

Für das inaktiv setzen / sperren des buttons konnte ich über google noch nichts finden. Nur Sachen für HTML oder Java-Script .. Und in der API weiß ich gar nicht, wo ich suchen sollte ..


----------



## *Hendrik (21. Nov 2007)

Schau Dir doch die Api zum JToggleButton an und such Dir die Methoden raus, die etwas mit nem Icon zu tun haben. Z.B.  setIcon, setPressedIcon, setRolloverIcon, setSelectedIcon. Dann nimmst Du die Methode, die Du für Dich benötigst. 
Du kannst ein Icon auch bereits dem Konstruktor mitgeben.

Zum inaktiv setzen des Buttons:


```
element.setEnabled(false);
```


----------



## blaues_etwas (21. Nov 2007)

setEnabled eignet sich für mein Button nicht, da das Icon angezeigt werden soll, aber mit setEnabled(false) wird der ganze Button dunkelgrau gefärbt und gesperrt. Es muss aber das Icon noch zu sehen sein.
Gibt es eine Möglichkeit, den Button zu sperren, ohne dass ich der Button dunkelgrau färbt.


----------



## *Hendrik (21. Nov 2007)

Wenn Du mit setDisabledIcon(...) nochmal das gleiche Icon setzt wie mit setIcon(...), wird zumindest das Icon bei setEnable(false) nicht grau.


----------



## blaues_etwas (22. Nov 2007)

danke *Hendrik für deine Hilfe.
Prinzipiell funktioniert das nun, wie es soll. Eine Kleinigkeit fehlt noch, und zwar, besitzt dieser JToggleButton schon eine Variable, mit der ich "gedrückt" und "nicht gedrückt" abfragen kann? 
*in API nix find*


----------



## *Hendrik (22. Nov 2007)

```
isSelected();
```


----------



## blaues_etwas (22. Nov 2007)

*seufz* , ich bin so doof ..
programmieren wollen, aber die einfachsten Sachen in der API nicht finden .. ^^

Vllt. kann man mir hier nochmal kurz helfen 

```
public void sperreButton(JToggleButton b)
{
	b.setIcon(icon);
	b.setDisabledIcon(icon);
	b.setEnabled(false);
}
public void actionPerformed(ActionEvent e)
{
	if(e.getSource()==button1)
	{
		sperreButton(e.getSource());
	}
	if(e.getSource()==button2)
	{
		sperreButton(e.getSource());
	}
	[..]
}
```
Fehler:
sperreButton(javax.swing.JToggleButton) in meinJPanel cannot be applied to (java.lang.Object)
sperreButton(e.getSource());


----------



## *Hendrik (22. Nov 2007)

Setzt Du das Icon dynamisch? Wenn nein würde ich die beiden Zeilen

```
b.setIcon(icon); 
   b.setDisabledIcon(icon);
```

aus der Methode sperreButton() rausnehmen und bei der Initialisierung Deines Fenster bzw. Deiner Buttons direkt angeben.
Die Frage ist, ob Du dann überhaupt noch eine separate Methode fürs Sperren benötigst oder einfach in actionPerformed setEnable(false); setzt.

Das müsste so sein:

public void actionPerformed(ActionEvent e) 
{ 
   if(e.getSource()==button1) 
   { 
      sperreButton((JToggleButton)e.getSource()); 
   } 
   if(e.getSource()==button2) 
   { 
      sperreButton((JToggleButton)e.getSource()); 
   } 
   [..] 
}


----------



## blaues_etwas (22. Nov 2007)

Ja, ich setze das Icon dynamisch..
Bei meiner Initialisierung wird schon ein Icon für den Button festgelegt. Wenn ich den Button klicke, soll aber ein anderes Icon angezeigt werden.
Mit dem Aufruf:

```
sperreButton((JToggleButton)e.getSource());
```
funktionierts, danke 

Wenn es dir nichts ausmacht, könntest du mit vllt. noch erklären, weshalb meines nicht geht, denn ich bin der Meinung, dass meine Lösung laufen sollte, nur der Compiler ist anderer Meinung ..


----------



## *Hendrik (22. Nov 2007)

getSource() gibt ein Object-Objekt zurück, allerdings erwartet Deine Methode sperreButton ein Objekt vom Typ JToggleButton. Deswegen musst Du das Object-Objekt casten.


----------

