# JLabel zum anklicken machen? Kugeln selektieren?



## Eva19 (27. Mai 2005)

Ich programmiere ein Spiel das viele verschieden farbige Kugeln auswirft, 
wenn mehrere kugeln mit der selben farbe nebeneinander sind sollen sie weggeklickt werden können. 
Mein Problem ist nun das ich die Kugeln als JLabel in das Programm geschrieben habe und wie soll ich dem Programm klar machen welche Farbe die Kugeln an der jeweiligen Stelle hat????
Ich bin echt verzweifelt hab nämlich keine Ahnung wie ich des machen soll.
Wenn mir jemand helfen kann vielen, vielen Dank schon mal im vorraus
Eva19

_L-ectron-X hat den Titel angepasst._


----------



## Thammi (27. Mai 2005)

Ich würde das Spielfeld in einem Array speichern, dort kann man dann die Farbe einfach auslesen.


----------



## Eva19 (27. Mai 2005)

Ich hab nicht so viel Ahnung von programmmieren wäre lieb wenn dus mir ein bisschen genauer erklären könntest.


----------



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

Ich nehme an, er meint ein Array von JLabel-Referenzen....
Um ein JLabel anklickbar zu machen, registrierst du einfach, genau wie an einem JButton, einen ActionListener.
Ansonsten ist ein wenig Code gern gesehen... :wink:


----------



## Eva19 (30. Mai 2005)

Ich habs mit nem MouseListener probiert aber des geht irgendwie net. Bist du sicher das ich nen Actionlistener brauch???


----------



## Sky (30. Mai 2005)

Eva19 hat gesagt.:
			
		

> Ich habs mit nem MouseListener probiert aber des geht irgendwie net. Bist du sicher das ich nen Actionlistener brauch???


Was heißt das "des geht irgendwie net" ? Was passiert bzw. passiert nicht? Gibt es Fehlermeldungen??

So sollte es gehen:

```
class LabelMouseListener extends MouseAdapter {
  public void mouseClicked( MouseEvent e ) {
    System.out.println( "Klick auf: " + e.getSource() );
  }
}
```

In der Hauptklasse wird so der Listener zugewiesen:

```
jLabel.addMouseListener( new LabelMouseListener() );
```


----------



## Eva19 (30. Mai 2005)

Das funktioniert au net.
Hier mein Code:


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

public class KugelPanel extends JPanel  {

  static final ImageIcon []  kugeln = new ImageIcon[] {
    new ImageIcon(ClassLoader.getSystemResource("rot.jpg")),
    new ImageIcon(ClassLoader.getSystemResource("blau.jpg")),
    new ImageIcon(ClassLoader.getSystemResource("grün.jpg")),
    new ImageIcon( ClassLoader.getSystemResource("grau.jpg")),
    new ImageIcon(ClassLoader.getSystemResource("gelb.jpg"))


  }; class LabelMouseListener extends MouseAdapter {
  public void mouseClicked( MouseEvent e ) {
    System.out.println( "Klick auf: " + e.getSource() );
  }
}

  public KugelPanel(int spaltenAnzahl, int zeilenAnzahl) {
    this.setLayout( new BoxLayout( this,BoxLayout.X_AXIS));
    int spalte = 0;
    while(spalte<spaltenAnzahl){
      JPanel spaltenPanel = new JPanel();
      spaltenPanel.setLayout( new BoxLayout(spaltenPanel, BoxLayout.Y_AXIS));
      for (int zeile=0; zeile<zeilenAnzahl; zeile++){
        int farbe = (int)(Math.random()*5);
        spaltenPanel.add( new JLabel( kugeln[farbe]));
       }
      this.add( spaltenPanel);
      spalte++;



    }

  }

Und die Hauptklasse:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;



public class hauptfenster extends JFrame implements ActionListener{
    public hauptfenster (){
        super ("klick the balls");
        JTextField name = new JTextField();
        setDefaultCloseOperation (EXIT_ON_CLOSE);
        setSize ( 800, 800);
        Container contents = getContentPane ();
         contents.setLayout(new BoxLayout( contents , BoxLayout.X_AXIS));


           JPanel p1= new KugelPanel (10,15) ;
           

           
           JPanel p2= new JPanel(new GridLayout(5,1));
           p2.setPreferredSize(new Dimension( -200, 500));
           p2.setBackground( Color.gray);

        JButton button = new JButton ("Neu");
        button.addActionListener ( this);



        JLabel points = new JLabel ("Points:");
        JLabel highscore = new JLabel ("Highscore:");
        JLabel Name = new JLabel ("Name:");




          p2.add(points);
          p2.add(highscore);
          p2.add(Name);
          p2.add(name);
          p2.add(button);

          




          contents.add(p1);
          contents.add(p2);

           jLabel.addMouseListener( new LabelMouseListener() );






    }

       }





    public void actionPerformed (ActionEvent e){
        System.out.println ("Nochmal");



       }
    public static void main ( String[] args){
        new hauptfenster ().show ();

    }
}
```


----------



## Eva19 (30. Mai 2005)

Muß ichs vielleicht an einer anderen Stelle einfügen?


----------



## Sky (30. Mai 2005)

Du musst den Mouselistener in der for-Schleife hinzufügen, wo Du dein Spielbrett aufbaust!


----------



## Eva19 (30. Mai 2005)

Tut mir leid wenn ich dich nerven muß aber des geht au net.
Hilfe!!!!!!!!


----------



## Sky (30. Mai 2005)

Versuchs mal so:


```
public KugelPanel( int spaltenAnzahl, int zeilenAnzahl ) {
    this.setLayout( new BoxLayout( this, BoxLayout.X_AXIS ) );
    int spalte = 0;
    LabelMouseListener mouselistener = new LabelMouseListener();
    while( spalte < spaltenAnzahl ) {
      JPanel spaltenPanel = new JPanel();
      spaltenPanel.setLayout( new BoxLayout( spaltenPanel, BoxLayout.Y_AXIS ) );
      for( int zeile = 0; zeile < zeilenAnzahl; zeile++ ) {
        int farbe = ( int )( Math.random() * 5 );
        JLabel label = new JLabel( kugeln[farbe] );
        label.addMouseListener( mouselistener );
        spaltenPanel.add( label );
      }
      this.add( spaltenPanel );
      spalte++;
    }
  }
```

Wenn das nicht geht, dann bitte mal die (Fehler-)Meldung posten!!!


----------



## Eva19 (30. Mai 2005)

Geht immer noch net

Die Fehlermeldung lautet:
KugelPanel.java:23: cannot resolve symbol
symbol: class LabelMouseListener
location: class KugelPanel
    LabelMouseListener mouselistener = new LabelMouseListener ();

KugelPanel.java:23: cannot resolve symbol
symbol: class LabelMouseListener
location: class KugelPanel
 LabelMouseListener mouselistener = new LabelMouseListener ();

KugelPanel.java:34: cannot resolve symbol
symbol : variable label
location: class KugelPanel
 label.addMouseListener( mouselistener);

KugelPanel.java:36: cannot resolve symbol
symbol: variable spaltenPanel
location: class KugelPanel
      this.add( spaltenPanel);

4 errors


----------



## L-ectron-X (30. Mai 2005)

So weit so gut. Was den ActionListener angeht, hast du natürlich Recht, da habe ich Unsinn erzählt, sorry.
Hier aber nun deine etwas modifizierten Klassen:

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

public class Hauptfenster extends JFrame implements ActionListener {
   private JButton b_neu;
   private JLabel l_points, l_highscore, l_name;
   private JPanel p1, p2;
   private JTextField tf_name;
   private LabelMouseListener mouselistener;

   public Hauptfenster (){
      super ("klick the balls");
      setDefaultCloseOperation (EXIT_ON_CLOSE);
      int size = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 100;
      setSize (size, size);
      setLocationRelativeTo(null);
      Container contents = getContentPane ();
      contents.setLayout(new BoxLayout( contents , BoxLayout.X_AXIS));

      mouselistener = new LabelMouseListener();

      p1 = new KugelPanel (10,15) ;
      
      p2 = new JPanel(new GridLayout(5,1));
      p2.setPreferredSize(new Dimension( -200, 500));
      p2.setBackground( Color.gray);

      tf_name = new JTextField();

      b_neu = new JButton("Neu");
      b_neu.addActionListener(this);

      l_points = new JLabel("Points:");
      l_points.addMouseListener(mouselistener);
      
      l_highscore = new JLabel("Highscore:");
      l_highscore.addMouseListener(mouselistener);
      
      l_name = new JLabel("Name:");
      l_name.addMouseListener(mouselistener);

      p2.add(l_points);
      p2.add(l_highscore);
      p2.add(l_name);
      p2.add(tf_name);
      p2.add(b_neu);

      contents.add(p1);
      contents.add(p2);
   }
   
   public void actionPerformed (ActionEvent e){
      System.out.println ("Nochmal");
   }

   public static void main ( String[] args){
      new Hauptfenster().setVisible(true);
   }
}
```


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

public class KugelPanel extends JPanel {

   static final ImageIcon []  kugeln = new ImageIcon[] {
      new ImageIcon(ClassLoader.getSystemResource("rot.jpg")),
      new ImageIcon(ClassLoader.getSystemResource("blau.jpg")),
      new ImageIcon(ClassLoader.getSystemResource("grün.jpg")),
      new ImageIcon( ClassLoader.getSystemResource("grau.jpg")),
      new ImageIcon(ClassLoader.getSystemResource("gelb.jpg"))
   };

   public KugelPanel(int spaltenAnzahl, int zeilenAnzahl) {
      this.setLayout( new BoxLayout( this,BoxLayout.X_AXIS));
      int spalte = 0;
         while(spalte<spaltenAnzahl){
            JPanel spaltenPanel = new JPanel();
            spaltenPanel.setLayout( new BoxLayout(spaltenPanel, BoxLayout.Y_AXIS));
            for (int zeile=0; zeile<zeilenAnzahl; zeile++){
            int farbe = (int)(Math.random()*5);
            spaltenPanel.add( new JLabel( kugeln[farbe]));
         }
         this.add( spaltenPanel);
         spalte++;
      }
   }
}
```


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

public class LabelMouseListener extends MouseAdapter {
   public void mouseClicked(MouseEvent e) {
      System.out.println( "Klick auf: " + e.getSource() );
   }
}
```


----------



## Eva19 (31. Mai 2005)

Jetzt läufts vielen vielen Dank!!!!!
Ohne euch wär ich verlorn hab leider net so viel Ahnung:-((


----------



## Eva19 (31. Mai 2005)

Hab noch ne blöde Frage wie mach ich das mein Programm erkennt an welcher Stelle welche Farbe ist???


----------



## L-ectron-X (1. Jun 2005)

Du brauchst eine Klasse, mit deren Hilfe du die Positionen sämtlicher Kugeln mit ihren Farben speicherst. Dazu wäre es gut, die GUI von der Logik zu trennen. Die GUI soll dann wirklich nur noch zur Anzeige des Spielzustands und zur Interaktion mit dem Spieler dienen.
Eine Möglichkeit wäre bspw. die Positionen der Kugeln in ein zweidimensionales Array zu schreiben. Schreibe bspw. eine Klasse _Kugel_, in der du mögliche Eigenschaften einer Kugel verwaltest. Z.B. die Farbe. Und außerdem eine Klasse _Kugeln_, in der du mit Hilfe des zweidimensionalen Arrays die Positionen jeder einzelnen Kugel-Instanz speicherst. Eine Klasse _Logik_ kann die Spielregeln enthalten und mit der GUI und den _Kugeln_ kommunizieren.
Zugegeben, nicht ganz einfach, aber ein möglicher Lösungsweg.


----------



## Eva19 (1. Jun 2005)

Ich glaub ich bin zu blöd zum programmieren versteh nur Bahnhof, sorry.


----------



## Sky (1. Jun 2005)

Das ganze nennt sich MVC. Ist in der FAQ gut beschrieben: http://java-forum.org/de/viewtopic.php?t=6090#52829


----------



## Eva_19 (15. Jun 2005)

Hi da bin ich wieder!!!!
Also mein spiel erkennt mitllerweile welche Kugel ich wo angeklickt hab und welche Farbe sie hat aber jetzt hab ich das Problem das ich nicht weiß wie ich nur die ausgewählten Kugeln lösche???
Hat jemand ne Idee???
Danke!!!


----------



## L-ectron-X (15. Jun 2005)

Wie ich oben schon mal erklärt habe, kann man Eigenschaften in Objekten kapseln.
Das heißt, ob eine Kugel geklickt wurde oder nicht ist quasi ein Objektzustand. Gewählt oder nicht gewählt. Ja oder nein. 1 oder 0. Welcher Datentyp kommt dafür wohl in Frage?
*boolean*! Richtig.
Das bedeutet, deine Kugel-Objekte brauchen eine Variable, die diesen Zustand speichert. Außerdem Methoden die den Zustand setzen oder ausgeben können:

```
private boolean isSelected; //Instanzvariable vom Typ boolean

public Kugel() { //Konstruktor
  ...
  isSelected = false;
  ...
}

public void setSelectionValue() { //als geklickt oder nicht geklickt markieren
  if(isSelected)
    isSelected = false;
  else
    isSelected = true;
}

public boolean getIsSelected() {
  return isSelected;
}
```
Eine andere Klasse, kann nun den Zustand ermitteln und entsprechend mit dieser Kugel umgehen.


----------



## Eva19 (15. Jun 2005)

Versteh ich net so richtig ich weiß meinen Kugeln int werte zu ob sie bekannt sind oder nicht 


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

public class Haupt extends JFrame implements ActionListener {

// Die Variablen
   private JButton b_neu, b_speichern;
   private JLabel l_points, l_highscore;
   private JPanel p2, p_name;
   private KugelPane2 p1;
   private JTextField t_name;
    Container contents;
    int geklickt=1;

// Formatierung des GUI
   public Haupt() {

      super ("klick the balls");
      setDefaultCloseOperation (EXIT_ON_CLOSE);

      setResizable( false);
      contents = getContentPane ();
      contents.setLayout(new BoxLayout( contents , BoxLayout.X_AXIS));

      p1 = new KugelPane2(15, 10) ;
      p1.addMouseListener(new LabelMouseListener ());
      p1.setBackground( Color.white);

      p2 = new JPanel(new GridLayout(25,2));
      p2.setPreferredSize(new Dimension( 200, 100));
      p2.setBackground( Color.orange);

      b_neu = new JButton("Neu");
      b_neu.addActionListener(this);

      l_points = new JLabel("  Points:");

      l_highscore = new JLabel("  Highscore:");

      p2.add(l_points);
      p2.add(b_neu);
      p2.add(l_highscore);

      contents.add(p1);
      contents.add(p2);
      pack ();
   }

   public void actionPerformed (ActionEvent e){
        contents.removeAll();
        p1 = new KugelPane2(15,10);
        p1.addMouseListener(new LabelMouseListener ());
        p1.setBackground(Color.white);
        contents.add(p1);
        contents.add(p2);
        validate();
   }

  // Das GUI für die Namenseingabe
  public class FensterName extends JFrame implements ActionListener{

    JTextField textField;
    JButton button;
  /** Creates a new instance of SimpleGui */

     public FensterName() {

        super( "Ihr Name"); // Titel initialisieren

        setDefaultCloseOperation( EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setSize(200, 100);
        setResizable( false);

        //FensterName.setBackground( Color.orange);

        Container contentPane = getContentPane();
        System.out.println( contentPane.getLayout().getClass());
        contentPane.setLayout( new FlowLayout());
        contentPane.add( new JLabel( "Name"));
        contentPane.setBackground( Color.orange);

        textField = new JTextField(10);
        contentPane.add( textField);
        button = new JButton( "OK");
        button.addActionListener( this); // *hier auskommentieren*
        contentPane.add( button);
     }

     public void actionPerformed( ActionEvent e) {
        System.out.println( "Ihr Name: " + textField.getText());
        textField.setText( "");
     }
  }



   public class LabelMouseListener extends MouseAdapter  {

      static final int KUGELBREITE=40;
      static final int KUGELHOEHE=40;

        public void mouseClicked( MouseEvent e) {
          int mausx = e.getX();
          int mausy = e.getY();

          //row und column berechnen aus Koordinaten und Kugelgroesse
         if ( geklickt==1){
          int zeilenNr = (mausy/KUGELHOEHE);
          int spaltenNr = (mausx/KUGELBREITE) ;

           Kugel k = p1.getKugel( zeilenNr, spaltenNr);
           System.out.println( "KUGEL " + zeilenNr + "/" + spaltenNr + " Kugelfarbe: " + k.getFarbe());

           p1.suchen( zeilenNr, spaltenNr, k.getFarbe());

           geklickt++;

         } else if( geklickt==2){

           int zeilenNr = (mausy/KUGELHOEHE);
           int spaltenNr = (mausx/KUGELBREITE) ;

           Kugel k = p1.getKugel( zeilenNr, spaltenNr);
           System.out.println( "KUGEL " + zeilenNr + "/" + spaltenNr + " Kugelfarbe: " + k.getFarbe());

           p1.suchen( zeilenNr, spaltenNr, k.getFarbe());

           p1.removeAll();
           validate();

           if (k.getStatus()==1 ){
              for( int a = 0; a < 15; a++){
                for (int b = 0; b < 10; b++){

                  k.setStatus( 0);
                  //p1.kugeln[a][b] = ;

                }
              }

           } else;

           System.out.println("2. geklickt" + geklickt );
           geklickt = 1;
           System.out.println("2. geklickt" + geklickt );

         }

        }
   }

   public static void main ( String[] args){
      new Haupt().setVisible(true);
   }

}
```




```
public class Kugel extends JLabel {
     public static final int FARBE_ROT = 0;
     public static final int FARBE_BLAU = 1;
     public static final int FARBE_GRUEN = 2;
     public static final int FARBE_GRAU = 3;
     public static final int FARBE_GELB = 4;
     
     final static ImageIcon[] ICONS = new ImageIcon[] {
      new ImageIcon(ClassLoader.getSystemResource("rot.gif")),
      new ImageIcon(ClassLoader.getSystemResource("blau.gif")),
      new ImageIcon(ClassLoader.getSystemResource("grün.gif")),
      new ImageIcon( ClassLoader.getSystemResource("grau.gif")),
      new ImageIcon(ClassLoader.getSystemResource("gelb.gif"))
     };

     public static final int STATUS_UNBEKANNT = 0;
     public static final int STATUS_PASST = 1;
     public static final int STATUS_PASST_NICHT =2;
     
     int farbe;
     int status;

     public Kugel(int farbe) {
       this.farbe = farbe ;
       setIcon( ICONS[farbe]);
     }

     public int getFarbe() {
       return farbe;
     }
     
     public int getStatus() {      //bekommen
       return status;
     }
     
     public void setStatus( int status) {    //geben
       this.status = status;
     }

}
```




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

public class KugelPane2 extends JPanel {

   Kugel[][] kugeln;
   int zeilenAnzahl;
   int spaltenAnzahl;

   public KugelPane2( int zeilenAnzahl, int spaltenAnzahl) {
      this.setLayout( new GridBagLayout());
      GridBagConstraints c = new GridBagConstraints ();
      c.anchor = GridBagConstraints.NORTHWEST;

      this.zeilenAnzahl = zeilenAnzahl;
      this.spaltenAnzahl = spaltenAnzahl;
      kugeln = new Kugel[zeilenAnzahl][spaltenAnzahl];

      int zeilenNr = 0;
      while(zeilenNr<zeilenAnzahl){
          for (int spaltenNr=0; spaltenNr<spaltenAnzahl; spaltenNr++){
            int farbe = (int)(Math.random()*5);
             c.gridx=spaltenNr;
             c.gridy=zeilenNr;
             Kugel neueKugel=new Kugel(farbe);
             this.add(neueKugel,c);
             kugeln[zeilenNr][spaltenNr]=neueKugel;
          }
         zeilenNr++;
      }
   }

    public Kugel getKugel(int zeilenNr, int spaltenNr){
      return kugeln[zeilenNr][spaltenNr];
    }

    public void suchen( int zeilenNr, int spaltenNr, int farbe) {
      for ( int zeile=0; zeile<zeilenAnzahl; ++zeile) {
        for ( int spalte=0; spalte<spaltenAnzahl; ++spalte) {
          kugeln[zeile][spalte].setStatus( Kugel.STATUS_UNBEKANNT);
        }
      }
      int anzahl = markieren( zeilenNr, spaltenNr, farbe);

      System.out.println( anzahl + " kugeln gefunden");
    }
    
    int markieren( int zeilenNr, int spaltenNr, int farbe) {
      System.out.println( "markiere " + zeilenNr + "/" + spaltenNr);
        Kugel k = kugeln[zeilenNr][spaltenNr];
      if ( k.getStatus() == Kugel.STATUS_UNBEKANNT) {
        if ( k.getFarbe() == farbe) {
          int anzahl = 1;

          k.setStatus( Kugel.STATUS_PASST);

          if (zeilenNr>0){ // OBEN
             anzahl += markieren( zeilenNr-1, spaltenNr, farbe);
           }
           if (spaltenNr>0) { // LINKS
             anzahl += markieren( zeilenNr, spaltenNr-1, farbe);

           }
           if(zeilenNr<14) { // UNTEN
             anzahl += markieren( zeilenNr+1, spaltenNr, farbe);

           }
           if (spaltenNr<9) { // RECHTS
             anzahl += markieren (zeilenNr, spaltenNr+1, farbe);

           } //if (k.getStatus()== Kugel.STATUS_PASST){
          // setBackground(Color.black);
          //}else;
           return anzahl;

        } else {
          k.setStatus( Kugel.STATUS_PASST_NICHT);
          return 0;
        }
      } else {
        return 0;
      }
    }
}
```

_L-ectron-X hat Code-Tags eingefügt._


----------



## L-ectron-X (15. Jun 2005)

Du hast Fortschritte gemacht, aber dein Code ist etwas konfus. Z.B. warum wird in der actionPerformed()-Methode, die ja eigentlich auf einen Button registriert sein soll, der LabelMouseListener registriert? Zumal er ja schon weiter oben registriert wurde.
Im Prinzip kannst du jetzt die mouseClicked()-Methode überschreiben und das Event nach der angeklickten Komponente fragen. Und genau diese Komponente (nämlich ein JLabel) kannst du vom JPanel entfernen. Bisher entfernst du an verschiedenen Codestellen alle Kugeln (JLabels) von der Spieloberfläche.
Also, etwas Korrekturarbeit ist angesagt. :wink: 
Ansonsten: Weiter so!

PS: Ich habe mir zum Testen einen Satz Kugeln erstellt. Wenn Du möchtest kannst du dir die Grafiken herunterladen.
http://www.bytes4fun.de/applications/forum/Kugeln.zip


----------

