JLabel zum anklicken machen? Kugeln selektieren?

Status
Nicht offen für weitere Antworten.

Eva19

Mitglied
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

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

Eva19

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

L-ectron-X

Gesperrter Benutzer
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

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

Sky

Top Contributor
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:
Code:
class LabelMouseListener extends MouseAdapter {
  public void mouseClicked( MouseEvent e ) {
    System.out.println( "Klick auf: " + e.getSource() );
  }
}

In der Hauptklasse wird so der Listener zugewiesen:
Code:
jLabel.addMouseListener( new LabelMouseListener() );
 

Eva19

Mitglied
Das funktioniert au net.
Hier mein Code:

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 ();

    }
}
 

Sky

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

Sky

Top Contributor
Versuchs mal so:

Code:
  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

Mitglied
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

Gesperrter Benutzer
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:
Code:
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);
   }
}
Code:
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++;
      }
   }
}
Code:
import java.awt.event.*;

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

Eva19

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

L-ectron-X

Gesperrter Benutzer
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.
 
E

Eva_19

Gast
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

Gesperrter Benutzer
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:
Code:
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

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

Code:
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);
   }

}



Code:
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;
     }

}



Code:
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

Gesperrter Benutzer
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Animation fliegendes JLabel Spiele- und Multimedia-Programmierung 1
J Java3D & Swing: JLabel auf Box positionieren? Spiele- und Multimedia-Programmierung 2
U Quadrate anklicken LWJGL Spiele- und Multimedia-Programmierung 3
Meldanor Bestimmte Fläche anklicken - Wie elegant lösen? Spiele- und Multimedia-Programmierung 14
T Bewegte Zeichnungen anklicken Spiele- und Multimedia-Programmierung 7
ThoraxLaneus Minecraft MCP-Client mit Optifine fertig machen in IntelliJ klappt nicht ganz Spiele- und Multimedia-Programmierung 6
L Schriftschatten dunkler machen Spiele- und Multimedia-Programmierung 2
X LWJGL | Parent.isDisplayable() must be true | wie kann man das zu true machen? Spiele- und Multimedia-Programmierung 0
P g.translate(x,y); rückgängig machen Spiele- und Multimedia-Programmierung 2
R Pong -Reruns möglich machen Spiele- und Multimedia-Programmierung 2
aze Java 3D:Screenshot machen.Komische Farben Spiele- und Multimedia-Programmierung 3
M BufferedImage blass machen Spiele- und Multimedia-Programmierung 5
G wie kann ich jar dateien fürs handy kopatibel machen Spiele- und Multimedia-Programmierung 3
T GBA Emulator machen - wie geht das? Spiele- und Multimedia-Programmierung 6
S Wie kann ich das Zeichnen der Grafik feiner machen? Spiele- und Multimedia-Programmierung 9
A Mauszeiger unsichtbar machen Spiele- und Multimedia-Programmierung 1

Ähnliche Java Themen

Neue Themen


Oben