# ActionListener: welcher Button wurde geklickt



## DD2k (22. Jan 2009)

Hallo ihr,
ich bin gerade dabei ein Kartenspiel für die FH zuschreiben. Soweit funktioniert auch alles gut.
Wie im Code zu sehen ist, erstellt das Prog 12 Buttons mit den Eigenschaften der Karten (Form, Farbe, Anzahl, Füllung).
Wenn 3 Buttons angeklickt wurden wird überprüft ob ein Set (en.wikipedia.org/wiki/Set_(game)) gefunden wurde.
Jetzt bin ich allerdings über ein Problem gestolpert bei dem google nicht weiterhilft . Um die Karten zu vergleichen muss ich ja wissen 
welche Buttons gedrückt wurden. Deshalb hab ich mir in den ActionListener eine If/Else Anweisung eingebaut, 
die mir in einen ActionEvent Array die angeklickten Button einträgt. Wenn ich den Array auswerte kommt ein recht wirrer String dabei raus:

java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=html>Rechteck
Drei
blau
Schraffue</html>,when=1232658576869,modifiers=Button1] onjavax.swing.JToggleButton[,136,70,58x60,alignmentX=0.0,alignmentY=0.5,border=,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,
disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,
rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=<html>Rechteck
Drei
blau
Schraffue</html>]


Jetzt zu meiner Frage: Gibt es eine "komfortablere/übersichtlichere" Methode die mir die angeklickten Buttons liefert oder muss ich mit meiner Lösung leben.

Danke im Voraus und  Grüße
DD2k



```
import java.awt.*; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;

public class SetTisch extends JFrame
                      implements ActionListener {
	
    private static final long serialVersionUID = -1422800525782761329L;
    private static ArrayList<SetKarte> stapel = new ArrayList<SetKarte>();
    private JToggleButton [] karten = new JToggleButton[12];
    private JPanel panelButton;
    private int geklicktAnzahl = 0; 
    ActionEvent [] geklicktButton = new ActionEvent [3] ;
    
    public void actionPerformed(ActionEvent e){
    	if(geklicktAnzahl < 2){    		
    		geklicktButton[geklicktAnzahl] = e;
    		geklicktAnzahl++;
    	}
    	else {
    		geklicktButton[geklicktAnzahl] = e;
    		for(int i = 0; i < 3; i++){
    			System.out.println(geklicktButton[i]);
    			geklicktAnzahl = 0;
    		}
    	}
    }

    public void buttonErstellen(ArrayList<SetKarte> stapel){    	
    	for(int i = 0; i < 12; i++){  		
			String text = new String("<html>" + stapel.get(i).getForm()
					                + "
" + stapel.get(i).getAnzahl()
					                + "
" + stapel.get(i).getFarbe()
					                + "
" + stapel.get(i).getFuellung()
					                + "</html>");				
    		this.karten[i] =  new JToggleButton(text);
    		this.karten[i].setSize(80, 120);
    		this.karten[i].setBorder(null);
    		this.karten[i].setBackground(Color.lightGray);
            karten[i].addActionListener(this);
    		this.panelButton.add(karten[i]);   
    		
    	}
    	this.getContentPane().add(panelButton);  
    	this.pack();
    	
    }
    public SetTisch(){
    	super("Tisch");
    	setSize(800,600);
    	setLocation(100,100);
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    	
    	panelButton = new JPanel(new GridLayout(2, 6, 10, 10));    	
    }
	
	public static void init(){
		SetTisch tisch = new SetTisch();    	    	
    	stapel = SetStapel.StapelErstellen();
    	tisch.buttonErstellen(stapel);
    	tisch.setVisible(true);  	
	} 
	public static void main(String args[]){
		init();
	}
}
```
[/code][/quote]


----------



## hdi (22. Jan 2009)

Ich würde statt einem ActionEvent Array ein Array nehmen, in das du sinnvolle Informationen über die Karte
reinschreibst. Am besten die Karte selber:

Karte[] selected;

Und wenn du am Ende vergleichen willst, hast du einfach nur 3 Karten-Objekte drin, und über geeingete
Methoden der Klasse "SetKarte" wirst du dann ja rausfinden können, ob es ein Set ist.


----------



## Ariol (22. Jan 2009)

ActionCodes setzen
oder mit e.getSource() und equals()


----------



## Ebenius (22. Jan 2009)

Ariol hat gesagt.:
			
		

> ActionCodes setzen
> oder mit e.getSource() und equals()


Du meinst ActionCommands.


----------



## Ariol (22. Jan 2009)

Oh Mann, heute hab ichs aber....


----------



## DD2k (22. Jan 2009)

Hi, erstmal danke für die schnellen Antworten. 
Die getActionCommand() Methode ist genau das was ich suche.
Dadurch wird der String übersichtlich und man kann ihn mit substring "beschneiden".

So hab ich es jetzt gelöst.

```
private int geklicktAnzahl = 0; 
    String [] geklicktButton = new String [3] ;
    public void actionPerformed(ActionEvent e){
    	if(geklicktAnzahl < 2){    		
    		geklicktButton[geklicktAnzahl] = 
                e.getActionCommand().substring(e.getActionCommand().length()-8,   e.getActionCommand().length()-7);
    		geklicktAnzahl++;
    	}
    	else {
    		geklicktButton[geklicktAnzahl] = 
               e.getActionCommand().substring(e.getActionCommand().length()-8, e.getActionCommand().length()-7);
    		for(int i = 0; i < 3; i++){
    			System.out.println(geklicktButton[i]);
    		}
  		geklicktAnzahl = 0;
    	}
    }
```

Also noch mal Danke für die Denkanstösse


----------



## Ebenius (22. Jan 2009)

Der Schönheit und Lesbarkeit zu Liebe, fass das doch etwas zusammen! 
	
	
	
	





```
final String cmd = e.getActionCommand();
if (geklicktAnzahl < 2) {    		
  geklicktButton[geklicktAnzahl++] = cmd.substring(cmd.length() - 8, cmd.length() - 7);
} else {
  geklicktButton[geklicktAnzahl] = cmd.substring(cmd.length() - 8, cmd.length() - 7);
  for(int i = 0; i < 3; i++){
    System.out.println(geklicktButton[i]);
  }
  geklicktAnzahl = 0;
}
```


----------



## Marco13 (22. Jan 2009)

Ich poste noch mal ganz klassisch den Link auf http://www.java-forum.org/de/viewtopic.php?p=310844


----------

