# Buttons Halma-Spiel



## Optimus_Prime (28. Juni 2009)

[moderator]In Bezug auf: http://www.tutorials.de/forum/java/245440-button-array-minesweeper.html?highlight=minesweeper[/moderator]

hallo zusammen,

ich habe ein ähliches problem und bin möglicherweise ein noch größerer anfänger und schaffe es deshalb nicht die oben geschriebenen instruktionen in die tat umzusetzten.
Mein Problem:
ich habe ein btnFeld[8][25] und ich möchte dass wenn ich auf einen dieser Buttons klicke die Koordinaten ausgegeben werden.


----------



## Akeshihiro (28. Juni 2009)

Das ist nun wirklich kein Kunststück...


```
btnFeld[8][25].addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println(((JButton)e.getSource()).getLocation());
	}					
});
```


----------



## Optimus_Prime (28. Juni 2009)

Wenn ich das kopiere und einfüge bekomme ich 18 errors.
ich wäre dir sehr dankbar wenn es ein wenig genauer gehen würde. vllt habe ich mich aber auch ein wenig undeutlich ausgedrückt.
also nochmal

ich habe das btnFeld[8][25] welches sich erstellt sobald das programm ausgeführt wird. und dann möchte ich die x und y koordinaten des btnFeld ausgeben, wenn ich auf einen dieser buttons klicke.
muss ich noch iwas importen? und wo muss ich deinen code hinkopieren?


----------



## DosCoder (28. Juni 2009)

Hi,
welche Errors bekommst du den so?
Diesen Quellcode musst du an jeden Button hängen, den du in deinem Feld verwendest.
Du musst natürlich ActionListener, ActionEvent und Jbutton importieren.
So sieht der Code aus, in dem die Buttons hinzu gefügt werden:

```
ActionListener listener = new ActionListener(){
     //Hier bitte den Code von Zeile 2-5 von Akeshihiro reinkopieren
  };
JButton[][] btnField = new JButton[8][25]
for(int  i = 0; i<8; i++){
 for(int s = 0; s<25, s++){
  JButton b = new JButton(),
  b.addActionListener(listener);
  btnField[i][s]  = b;
 }
}
```
_Code ist nicht getestet!_

Ich hoffe, ich habe alles richtig verstanden.
Ciao
DosCoder


----------



## Optimus_Prime (28. Juni 2009)

das problem ist jetzt nur dass ich ja an die 200 buttons hab von denen jeder das gleiche machen soll
kann ich das nicht iwie zusammen fassen?

also so ungefähr: 
	
	
	



```
public void btnFeld[x][y]_ActionPerformed(ActionEvent evt) {
```

aber das funktioniert nicht, wie mach ich das?


----------



## DosCoder (28. Juni 2009)

Hi,
ich weiß jetzt nicht, was dein Problem ist.
Dank der Schleife ist es egal, ob du 2, 200 oder 2000 Butons hast. Und der Listener ist eh immer derselbe, er wird ja auch nur einmal definiert. Und die außere Schleife führt 8 mal die innere aus, welche die Anweisungen 25 ausführt => 8 * 25 = 200. Es passt doch alles.

Ciao
DosCoder


----------



## Optimus_Prime (28. Juni 2009)

DosCoder hat gesagt.:


> Diesen Quellcode musst du an jeden Button hängen, den du in deinem Feld verwendest.



das heißt dann ja ich muss es an 200 buttons hängen ...


----------



## Akeshihiro (28. Juni 2009)

Optimus_Prime hat gesagt.:


> das heißt dann ja ich muss es an 200 buttons hängen ...





DosCoder hat gesagt.:


> Hi,
> welche Errors bekommst du den so?
> Diesen Quellcode musst du an jeden Button hängen, den du in deinem Feld verwendest.
> Du musst natürlich ActionListener, ActionEvent und Jbutton importieren.
> ...



Das machst du doch nicht von Hand 200 mal xD Dafür ist die Schleife da, wie DosCoder schon gezeigt hat.

Sorry für die Frage, aber warum fängst du mit GUI-Programmierung an, wenn du nicht mal die grundlegensten Grundlagen kannst?


----------



## Optimus_Prime (28. Juni 2009)

ok ich schreib jetzt einfach mal mein Quelltext der GUI hier rein und ihr sagt mir dann wo was hin muss in ordnung?
enweder steh ich extrem auf dem schlauch oder wir reden einfach die ganze zeit aneinander vorbei

dazu sollte ich vllt noch sagen dass ich dabei bin halma zu programmieren (für die schule). in der for-schleife werden die ganzen buttons erstellt und dann aussortiert welche gebraucht werden und welche nicht (wer ein halma feld kennt weiß möglicherweise wovon ich rede)
im anhang ist noch ein bild des spielfeldes.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 22.04.2009
  * @author
  */

public class HalmaGUI extends JFrame {
  // Anfang Variablen
  // Anfang Attribute
  private Steuerung dieSteuerung;
  private JButton[][] btnFeld = new JButton[9][25];
  private ImageIcon schwarz = new ImageIcon("schwarzerPunkt.gif");
  private ImageIcon rot = new ImageIcon("roterPunkt.gif");
  private ImageIcon blau = new ImageIcon("blauerPunkt.gif");
  private ImageIcon weiß = new ImageIcon("weißerPunkt.gif");
  private ImageIcon hrot = new ImageIcon("hellroterPunkt.gif");
  private ImageIcon hblau = new ImageIcon("hellblauerPunkt.gif");
  // Ende Attribute
  // Ende Variablen

  public HalmaGUI(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 793;
    int frameHeight = 810;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int px = (d.width - getSize().width) / 2;
    int py = (d.height - getSize().height) / 2;
    setLocation(px, py);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten


    for (int x=0; x<9; x++) {
      for (int y=0; y<25 ; y++ ) {
        btnFeld[x][y]=new JButton();
        btnFeld[x][y].setBounds(10+x*55,10+y*30,30,30);
        btnFeld[x][y].setText("");
        btnFeld[x][y].setToolTipText("");
        btnFeld[x][y].setActionCommand(""+(x+y*8));
        cp.add(btnFeld[x][y]);
        
                if(x==0 && y%2!=0){                     //nicht belegte Felder im
                  btnFeld[x][y].setVisible(false);      //Spielfeld
                }
                if(x==1 && y>1 && y<23 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==2 && y>2 && y<22 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==3 && y>3 && y<21 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==4 && y>4 && y<20 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==5 && y>3 && y<21 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==6 && y>2 && y<22 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==7 && y>1 && y<23 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==8 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }

                if(x==4 && y<4){                      //nicht belegte Felder oberhalb
                  btnFeld[x][y].setVisible(false);    //des Hofs
                }
                if(x==3 && y<3){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==5 && y<3){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==2 && y<2){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==6 && y<2){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==1 && y==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==7 && y==0){
                  btnFeld[x][y].setVisible(false);
                }

                if(x==4 && y>20){                    //nicht belegte Felder unterhalb
                  btnFeld[x][y].setVisible(false);   //des Hofs
                }
                if(x==3 && y>21){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==5 && y>21){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==2 && y>22){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==6 && y>22){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==1 && y==24){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==7 && y==24){
                  btnFeld[x][y].setVisible(false);
                }
                

      }
    }
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
    dieSteuerung=new Steuerung(this);
  }
  

  // Anfang Methoden
  public void aktualisiereGUI(int pX, int pY, int pValue) {
     if (pValue == 0) btnFeld[pX][pY].setIcon(weiß);
     if (pValue == 1) btnFeld[pX][pY].setIcon(rot);
     if (pValue == 2) btnFeld[pX][pY].setIcon(blau);
     if (pValue == 3) btnFeld[pX][pY].setIcon(hrot);
     if (pValue == 4) btnFeld[pX][pY].setIcon(hblau);
  }




  // Anfang Ereignisprozeduren
  

  // Ende Ereignisprozeduren
  // Ende Methoden

  public static void main(String[] args) {
    new HalmaGUI("HalmaGUI");
  }
}
```


----------



## DosCoder (28. Juni 2009)

Hi, 
da hast du doch schon eine Schleife. Nun noch oberhalb dieser die Implementiation des Listeners machen, und in die Schleife dann meinen Schleifeninhalt transferieren.

Wenn du keinen Text auf den Buttons ahben willst, dann ist der Aufruf von setText() sinnlos. Das gleiche gilt für setToolTip().

Außerdem würde ich noch mal über die Art deiner Butonauswahl nachdenken die ist nämlich nicht gerade hübsch. Schreib doch einfach ne Liste mit den Koordinaten die du (nicht) brauchst und prüfe dann bei jedem Button, ob er dazu gehöhrt.

Ciao
DosCoder


----------



## Optimus_Prime (28. Juni 2009)

ja die idee hatte ich auch schon, dummerweise nachdem ich das alles schon getippt hatte. 
Und aufgrund meines zeitdrucks ist dass hier erstmal wichtiger. Im mom ist funktionalität wichtiger als hübsches aussehen.



> HalmaGUI.java:131:15: ';' expected
> b.addActionListener(listener);
> ^



ach ja und aus reiner neugier, was macht dieses "@ Override"

EDIT: der pfeil zeigt auf den punkt


----------



## DosCoder (28. Juni 2009)

Hi,
sorry, in Zeile 7 habe ich aus Versehen nur ein "," eingeben, nicht ein ";". Allerdings hättest du das auch selber heraus finden können.

Das Wort @Override kennzeichnet, dass  hier eine Methode aus einer Elternklasse(hier ActionListener) überschrieben wird. Wenn ihr schon Vererbung hattet, dann weißt du, von was ich rede(extends, super, etc).
Wenn nicht:
http://de.wikibooks.org/wiki/Java_Standard:_Vererbung

Ciao
DosCoder


----------



## Optimus_Prime (28. Juni 2009)

oh ja stimmt das hätte mir wirklich auffallen können.

wenn ich es jetzt so mache, und 
	
	
	



```
btnField[i][s]
```
 durch 
	
	
	



```
btnFeld[x][y]
```
 ersetzt sind alle meine bilder auf den buttons weg und es passiert nix wenn ich auf einen button klicke.

wenn ich die letzte zeile 
	
	
	



```
(btnFeld[x][y] = b; )
```
 auskommentiere sind meine bilder wieder da aber leider passiert trotzdem nix wenn man draufklickt.


----------



## DosCoder (28. Juni 2009)

Hi
ich weiß, es ist spät am Abend.Aber: Was heißt den transferieren: _übertragen_. Also müssen natürlcih die Variablennamen angepasst werden, in deinem Fall also ist i gleich x und ...

Ciao
DosCoder


----------



## Optimus_Prime (28. Juni 2009)

ja das habe ich ja getan!

ich dachte eig ich hätte das deutlich beschrieben
ich habe  
	
	
	



```
btnField[i][s]
```


```
durch btnFeld[x][y] = b;
```
 ersetzt!

und genau dann verschwinden die bilder von meinen Buttons.

wenn ich jetzt genau diese zeile 
	
	
	



```
(btnFeld[x][y] = b; )
```
 auskommentiere, sind meine bilder wieder da jedoch passiert in beiden fällen nichts wenn ich auf einen butten klicke

?


----------



## DosCoder (28. Juni 2009)

Hi,
dein Code sollte letzendlich so aussehen(ungefährt):

```
ActionListener listener = new ActionListener(){
     //Hier bitte den Code von Zeile 2-5 von Akeshihiro reinkopieren
  };
 for (int x=0; x<9; x++) {
      for (int y=0; y<25 ; y++ ) {
        JButton b = new JButton(),
        b.addActionListener(listener);
        btnField[x][y]  = b;
        btnFeld[x][y].setBounds(10+x*55,10+y*30,30,30);
        btnFeld[x][y].setActionCommand(""+(x+y*8));
        cp.add(btnFeld[x][y]);
        
                if(x==0 && y%2!=0){                     //nicht belegte Felder im
                  btnFeld[x][y].setVisible(false);      //Spielfeld
                }
                if(x==1 && y>1 && y<23 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==2 && y>2 && y<22 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==3 && y>3 && y<21 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==4 && y>4 && y<20 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==5 && y>3 && y<21 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==6 && y>2 && y<22 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==7 && y>1 && y<23 && y%2==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==8 && y%2!=0){
                  btnFeld[x][y].setVisible(false);
                }

                if(x==4 && y<4){                      //nicht belegte Felder oberhalb
                  btnFeld[x][y].setVisible(false);    //des Hofs
                }
                if(x==3 && y<3){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==5 && y<3){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==2 && y<2){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==6 && y<2){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==1 && y==0){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==7 && y==0){
                  btnFeld[x][y].setVisible(false);
                }

                if(x==4 && y>20){                    //nicht belegte Felder unterhalb
                  btnFeld[x][y].setVisible(false);   //des Hofs
                }
                if(x==3 && y>21){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==5 && y>21){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==2 && y>22){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==6 && y>22){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==1 && y==24){
                  btnFeld[x][y].setVisible(false);
                }
                if(x==7 && y==24){
                  btnFeld[x][y].setVisible(false);
                }
                

      }
    }
```
Ciao
DosCoder


----------



## Optimus_Prime (28. Juni 2009)

ja genau, leider passiert nix wenn man auf einen button klickt


----------



## Akeshihiro (28. Juni 2009)

Ganz ehrlich... Ich versteh nicht wo genau dein Problem ist. Ich habe mal den Code genommen, den du gepostet hast und angepasst und bis auf die Tatsache, dass ich nicht weiß, was deine Steuerung-Klasse macht, funktioniert das, worum du gebeten hast... Die Position des Buttons, auf den geklickt wurde, wird mit meinem geposteten Code auf der Konsole ausgegeben.

Übrigens habe ich auch noch die tausend if-Bedingungen etwas abgeändert und die Erzeugung des Buttons nach hinten verschoben, damit die unnötigen Buttons nicht erzeugt werden. Das Programm startet zwar auch mit den tausend Buttons schnell, aber es ist dennoch eine unnötige Performance-Auslastung.

Und wie gesagt, ich weiß nicht, was die Klasse Steuerung macht, vielleicht werden da die Icons gesetzt. Jedenfalls werden in HalmaGUI keine Icons gesetzt und deswegen sind die Buttons auch alle leer.

Und hier der Code:


```
import java.awt.Dimension;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * Beschreibung
 * 
 * @version 1.0 vom 22.04.2009
 * @author
 */

public class HalmaGUI extends JFrame {
	private static final long serialVersionUID = 2976119233557138602L;
	
	// Anfang Variablen
	// Anfang Attribute
	private JButton[][] btnFeld = new JButton[9][25];
	private ImageIcon schwarz = new ImageIcon("schwarzerPunkt.gif");
	private ImageIcon rot = new ImageIcon("roterPunkt.gif");
	private ImageIcon blau = new ImageIcon("blauerPunkt.gif");
	private ImageIcon weiß = new ImageIcon("weißerPunkt.gif");
	private ImageIcon hrot = new ImageIcon("hellroterPunkt.gif");
	private ImageIcon hblau = new ImageIcon("hellblauerPunkt.gif");

	// Ende Attribute
	// Ende Variablen

	public HalmaGUI(String title) {
		// Frame-Initialisierung
		super(title);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		int frameWidth = 793;
		int frameHeight = 810;
		setSize(frameWidth, frameHeight);

		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		int px = (d.width - getSize().width) / 2;
		int py = (d.height - getSize().height) / 2;
		setLocation(px, py);

		Panel cp = new Panel(null);
		setContentPane(cp);
		// Anfang Komponenten

		ActionListener listener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(((JButton)e.getSource()).getLocation());
			}
		};

		for(int x = 0; x < btnFeld.length; x++) {
			for(int y = 0; y < btnFeld[x].length; y++) {
				if(x == 0 && y % 2 != 0) { // nicht belegte Felder im
					continue; // Spielfeld
				}
				if(x == 1 && y > 1 && y < 23 && y % 2 == 0) {
					continue;
				}
				if(x == 2 && y > 2 && y < 22 && y % 2 != 0) {
					continue;
				}
				if(x == 3 && y > 3 && y < 21 && y % 2 == 0) {
					continue;
				}
				if(x == 4 && y > 4 && y < 20 && y % 2 != 0) {
					continue;
				}
				if(x == 5 && y > 3 && y < 21 && y % 2 == 0) {
					continue;
				}
				if(x == 6 && y > 2 && y < 22 && y % 2 != 0) {
					continue;
				}
				if(x == 7 && y > 1 && y < 23 && y % 2 == 0) {
					continue;
				}
				if(x == 8 && y % 2 != 0) {
					continue;
				}

				if(x == 4 && y < 4) { // nicht belegte Felder oberhalb
					continue; // des Hofs
				}
				if(x == 3 && y < 3) {
					continue;
				}
				if(x == 5 && y < 3) {
					continue;
				}
				if(x == 2 && y < 2) {
					continue;
				}
				if(x == 6 && y < 2) {
					continue;
				}
				if(x == 1 && y == 0) {
					continue;
				}
				if(x == 7 && y == 0) {
					continue;
				}

				if(x == 4 && y > 20) { // nicht belegte Felder unterhalb
					continue; // des Hofs
				}
				if(x == 3 && y > 21) {
					continue;
				}
				if(x == 5 && y > 21) {
					continue;
				}
				if(x == 2 && y > 22) {
					continue;
				}
				if(x == 6 && y > 22) {
					continue;
				}
				if(x == 1 && y == 24) {
					continue;
				}
				if(x == 7 && y == 24) {
					continue;
				}

				btnFeld[x][y] = new JButton();
				btnFeld[x][y].setBounds(10 + x * 55, 10 + y * 30, 30, 30);
				btnFeld[x][y].addActionListener(listener);
				cp.add(btnFeld[x][y]);
			}
		}
		// Ende Komponenten

		setResizable(false);
		setVisible(true);

		new Steuerung(this);
	}

	public static void main(String[] args) {
		new HalmaGUI("HalmaGUI");
	}

	// Anfang Ereignisprozeduren

	// Ende Ereignisprozeduren
	// Ende Methoden

	// Anfang Methoden
	public void aktualisiereGUI(int pX, int pY, int pValue) {
		if(pValue == 0) btnFeld[pX][pY].setIcon(weiß);
		if(pValue == 1) btnFeld[pX][pY].setIcon(rot);
		if(pValue == 2) btnFeld[pX][pY].setIcon(blau);
		if(pValue == 3) btnFeld[pX][pY].setIcon(hrot);
		if(pValue == 4) btnFeld[pX][pY].setIcon(hblau);
		if(pValue == 5) btnFeld[pX][pY].setIcon(schwarz);
	}
}
```


----------

