# Ein Bild  beim drücken eines Button zuweisen



## sandy (25. Jul 2005)

Hi Leutz, 

ich versuche gerade verschiede Bilder unterschiedliche Buttons zuzuordnen. 
Aber ich bekomme das irgendwie nicht so hin. 


```
//Buttons erzeugen    
		JButton bild1Button = new JButton("Bild1");
		JButton bild2Button = new JButton("Bild2");
		JButton bild3Button = new JButton("Bild3");
		
		//Schaltfläche in Grundfläche hinzufügen
		add(bild1Button);
		add(bild2Button);
		add(bild3Button);
		
		//Schaltflächenaktion erzeugen 
		ImageIcon bild1Action = new ImageIcon("hellas.jpg");
		ImageIcon bild2Action = new ImageIcon("sandra.jpg");
		ImageIcon bild2Action = new ImageIcon("carmen.jpg");

                                //Aktion mit Schaltflächen verbinden
		bild1Button.addActionListener(bild1Action);
		bild2Button.addActionListener(bild2Action);
		bild3Button.addActionListener(bild3Action);
```

Ich weiß das da noch eine Klasse fehlt die den ActionListener implementiert. 
Abgesehen davon, wie kann ich dem Button ein Bild zuweisen??? Ich weiß nämlich nicht, ob das so richtig ist wie ich das gemacht habe. 
Denn eigentlich müsste die Klasse wo ich den ActionListener implementiere ImageIcon heißen. Aber das geht nicht.  

Hat von euch jemand einen Vorschlag für mich wie ich das machen könnte?? [/code]


----------



## L-ectron-X (25. Jul 2005)

Ein Icon für einen JButton mit Text:

```
JButton btn = new JButton("Text", new ImageIcon("EinIcon.gif"));
```
Für einen JButton ohne Text einfach das erste Argument weglassen (siehe Konstruktor von JButton)

Oder so:

```
JButton btn = new JButton();
btn.setIcon(new ImageIcon("EinIcon.gif"));
```

Der ActionListener ist besser in der Klasse aufgehoben, in dem der JButton definiert wird, also bspw. eine Subklasse von JPanel. Dazu kannst du direkt unter der Definition des JButtons schreiben:

```
btn.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    btnClicked();
  }
});

private void btnClicked() {
  //was passieren soll
}
```


----------



## Sky (25. Jul 2005)

- Wenn's in deiner Anwendung einen Controller gibt, so solltest Du die Events natürlich an diesen weiterleiten. 

- Wenn es keinen Controller gibt, aber mehrere Buttons, kann es u.U. besser sein, wenn die Klasse, in der sich die Panels befinden das ActionListener-Interface implementieren; die Zuweisung des Listeners geht dann über 
	
	
	
	





```
btn.addActionListener(this);
```

- Ansonsten ist die Lösung von 'L-ectron-X' natürlich richtig und in Ordnung.


----------



## sandy (25. Jul 2005)

Vielen Dank Jungs, ihr seit echt eine sehr große Hilfe für mich   .

Ohne euch wäre ich manchmal echt aufgeschmissen. 

Danke vielmals. 

Gruß 

Sandy


----------



## sandy (25. Jul 2005)

noch eine Frage. 


```
private void btnClicked() { 
  //was passieren soll 
}
```


bei einem anderen Programm konnte ich hier mit der Methode setBackground eine Hintergrungfarbe setzten. 
Das selbe möchte ich quasi mit den Bilder auch machen. Je nach dem welchen Button ich drücke soll das Bild erscheinen. Welche Methode nehme ich denn dafür??

[/code]


----------



## L-ectron-X (26. Jul 2005)

Du kannst in der actionPerformed()-Methode eine Fallunterscheidung einbauen.

```
public void actionPerformed(ActionEvent e) {
  Object quelle = e.getSource();
  if(quelle == bild1Button) {
    //lade ein Bild für diesen Button
    bild1ButtonClicked();
  }
  else if(quelle == bild2Button) {
    //lade ein Bild für diesen Button
    bild2ButtonBlicked();
  }
  //etc. pp.
}

private void bild1ButtonClicked() {
  //lade Bild für bild1Button
}

private void bild2ButtonClicked() { 
  //lade Bild für bild2Button 
}

//usw.
```
Das wäre jetzt der Code für sky80's Variante - also bei _implements ActionListener_

Bei der Variante, wie ich sie geschrieben hatte (also ohne implementierten ActionListener), würde das so aussehen:

```
//---im Konstruktor---
bild1Button.addActionListener(new ActionListener() { 
  public void actionPerformed(ActionEvent e) { 
    bild1ButtonClicked(); 
  } 
}); 

bild2Button.addActionListener(new ActionListener() { 
  public void actionPerformed(ActionEvent e) { 
    bild2ButtonClicked(); 
  } 
});
...
//---Ende Konstruktor---

private void bild1ButtonClicked() { 
  //lade Bild für bild1Buttonl 
}

private void bild2ButtonClicked() { 
  //lade Bild für bild2Button 
}
```


----------



## m!k3 (27. Jul 2005)

L-ectron-X hat gesagt.:
			
		

> Du kannst in der actionPerformed()-Methode eine Fallunterscheidung einbauen.
> 
> ```
> public void actionPerformed(ActionEvent e) {
> ...



ich meld mich nun auch mal mit nem fraunennamen an.. vielleicht sind dann auch alle so gütig und nett zu mir  :lol:  :roll:  :lol:


----------



## sandy (27. Jul 2005)

danke Jungs, ihr seit echt nett und sehr hilfsbereit. 

Ich lerne gerade für eine Klausur und da bin ich für jede Hilfe sehr dankbar


----------



## sandy (27. Jul 2005)

wieso kann ich bei diesen Methoden mit getImage nicht auf die Bilder zugreifen, um sie zu laden??


```
private void bild1ButtonClicked() { 
  //lade Bild für bild1Buttonl 
} 

private void bild2ButtonClicked() { 
  //lade Bild für bild2Button 
}
```

[/code]


----------



## L-ectron-X (27. Jul 2005)

Hast du ne Fehlermeldung?

Und übrigens: Bei mir ist in diesem Forum jeder gleich! Ich bin zu jedem gleich nett, egal ob Männlein oder Weiblein.
Es sei denn, es leistet sich jemand grobe Schnitzer, oder gibt sich selbst keine Mühe.


----------



## sandy (28. Jul 2005)

deine Einstellung finde ich gut L-ectron-X. Falls ich auch mal so gut in Java werden sollte wie du, will ich es genau so machen. Dieses Forum ist echt klasse.

Hier nochmal zu meinem Problem: 


```
private void button1Clicked(Image backgroundImage)
 { 
			 
        ImageIcon icon = new ImageIcon();
        getIconImage(backgroundImage);
 }
```

Die Fehlermeldung lautet 
"Syntax error on token ")", ; expected"


ich bin hier fast am verzweifeln. Ich trau mich schon fast gar nicht mehr zu posten.  :cry:


----------



## L-ectron-X (28. Jul 2005)

Nicht verzweifeln, immer munter weiter fragen, bis das Problem gelöst ist.  
Das Problem liegt, denke ich, nicht in dieser Methode^^.
Du hast wahrscheinlich die Registrierung des ActionListeners über anonyme (innere) Klassen vorgenommen, wie in meinem Beispiel:

```
bild1Button.addActionListener(new ActionListener() { 
  public void actionPerformed(ActionEvent e) { 
    bild1ButtonClicked(); 
  } 
});
```
Schau dir mal die letzte Zeile an. Hast du das auch so gemacht? Das muss hier so aussehen.
Vermutlich fehlt eine Klammer oder ist verdreht geschrieben.
Ich denke, es wäre auch besser beim Aufruf der bild1ButtonClicked()-Methode kein Argument zu übergeben.
Das Besorgen der Images und die weitere Arbeit mit ihnen sollte besser innerhalb der bild1ButtonClicked()-Methode passieren. So brauchst du dich beim Programmieren nur noch auf diese Methode konzentrieren, das ist auch weniger fehleranfällig. Für jede Teilaufgabe/Zwischenschritt macht sich eine weitere Methode ganz gut.

Und: Ich kenne Leute in diesem Forum, die sind wahre Java-Wälzer. Dagegen bin ich nur eine kleine Broschüre. :wink:


----------



## sandy (28. Jul 2005)

die klammern sind richtig gesetzt.

Mit welcher Methode kann ich mir die Images besorgen bzw. drauf zugreifen???

Ich glaube darin liegt mein ganzes Problem.

P.S.

Mach dich mal nicht schlechter als du bist. Es wird immer einen geben der besser ist. 

Für mich bist du der wahre Java-Wälzer. Denn du kannst viel mehr als ich   . 

Also heißt das weiter Üben. Und vielen danke für deine Hilfe   

Gruß 

Sandy


----------



## L-ectron-X (28. Jul 2005)

Hatte ich nicht weiter oben schon bereits gepostet, wie man einem JButton ein Icon zuweist?
Du willst doch auf einen JButton ein Bildchen setzen, oder? ???:L  Ansonsten verstehe ich gerade nicht, was nun das Problem ist. Hoffentlich haben wir nicht aneinander vorbeigeredet...


----------



## sandy (28. Jul 2005)

du hast recht, du hattest es oben schon erwähnt. 

Aber wenn ich in die Methode bild1ButtonClicked dem Button das Icon zuweise, dann bekomme ich eine Fehlermeldung


```
private void bild1ButtonClicked() { 
	                
                   JButton btn = new JButton(); 
	   btn.setIcon(new ImageIcon("test.gif"));

		 }
```


Die Fehlermeldung lautet dann

"syntax error on token(s), misplaced constucts"


----------



## L-ectron-X (28. Jul 2005)

Hm, ohne Code kann ich es schlecht prüfen.
Ich habe dir mal ein  ganz einfaches Programm zusammenzubastelt, was dir das mal kurz demonstriert.
Den ausführbaren Schnipsel in einer jar-Datei und den Quellcode kannst du hier herunterladen.


----------



## sandy (30. Jul 2005)

Danke für deine Hilfe. Ich habe es ausprobiert und es hat geklappt. 

Nochmal vielen Danke für deine Mühen die du dir gemacht hast.   

Gruß 

Sandy


----------

