# MouseListener ändert nicht das Lable Icon.



## Achilleus (10. Jan 2017)

Hallo liebe Leute,

ich bin ein Java Anfänger und habe mal aus Spaß mit einem neuen Projekt angefangen. Ich wollte ein kleines Spielchen schreiben mit einer 2D Karte auf, der man bauen können sollte. Ich scheitere daran, dass Programm so zu schreiben, dass man auch etwas bauen kann, wie Häuser oder Bäume.
Die Idee war, über ein Array von Labels, die in einem GridLayout angeordnet werden, eine Spielkarte zu schaffen und über ein MouseListener das Icon des geklickten Labels mit einem anderem zu ersetzen.

Ich habe folgenden gekürzten Code(ohne Bäume, Berge und Zufallsvariablen), wo es mir nur um den MouseListener geht geschrieben:


```
import javax.swing.JFrame;

public class Map3 {

    public static void main(String[] args) {

        JFrame jf = new MapBuilder();

    }
}
```


```
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;

public class MapBuilder extends JFrame implements MouseListener{
   
    public JLabel field[];
   
    //Bilddateien zur Kartengestaltung
    Icon gras = new ImageIcon(getClass().getResource("Gras1.png"));
    Icon baum = new ImageIcon(getClass().getResource("Baum1.png"));
   
    public MapBuilder() {
       
        //Frame
        setSize(500, 500);
        setLocationRelativeTo(null);
        setTitle("Map");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
       
        //Auf diesem Panel werden alle Grasbfelder angeordnet
        JPanel panela = new JPanel();
       panela.setVisible(true);
       panela.setBackground(Color.black);
       panela.setLayout(new java.awt.GridLayout( 100, 100, 0, 0 ));
       
       //Erzeugt i-mal Frasfelder die im Panel in einem GridLayout angeordnet werden
        JLabel [] field = new JLabel[10000];
        for(int i=0;i<10000;i++){   
           field[i] = new JLabel();
           field[i].setSize(25,25);
           field[i].setIcon(gras);
           // MouseListener damit, wenn das Label geklickt wird ein ein neues Bild erscheint zB Haus oder Baum
           field[i].addMouseListener(this);                 
           panela.add(field[i]);}
       
       JScrollPane scrollPane2 = new JScrollPane ( 
                  ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                  ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
       JViewport viewport2 = scrollPane2.getViewport();
       viewport2.setView(panela);
       
       add (scrollPane2);
        repaint();
        setVisible(true);
    }

    public void mouseClicked(MouseEvent me) {
       
        // Hier liegt der Fehler
        field[i].setIcon(baum);
         
       
    }

    public void mousePressed(MouseEvent me) {
    }

    public void mouseReleased(MouseEvent me) {
    }

    public void mouseEntered(MouseEvent me) {
    }

    public void mouseExited(MouseEvent me) {
    }

}
```
Ich wäre euch super dankbar, könntet ihr mir sagen, was ich falsch mache. Wenn, das was ich vorhabe mit diesem Ansatz nicht geht, dann könnt ihr mir das auch sagen, dann lasse ich es einfach.


----------



## Joose (10. Jan 2017)

Rechne dir zum Beispiel aus welches JLabel du gedrückt hast (mit Hilfe der Koordinaten wo die Maus gedrückt wurde)


----------



## Achilleus (15. Jan 2017)

Ich habe endlich eine Lösung gefunden. Hat etwas gedauert war aber dann doch ganz einfach. Joose deinen Lösungsvorschlag habe ich auch verfolgt und greife ihn vielleicht nochmal auf, wenn es darum geht mit einem Mausklick ein Objekt zu erzeugen, das mehr als nur über ein Feld geht.


```
JLabel label = (JLabel)me.getSource();
      label.setIcon(baum);
```

Das kommt in den MouseListener.


----------

