Utiliser un JLabel Dynamique dans un event du meme JLabel [Résolu]

Signaler
Messages postés
31
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
24 septembre 2020
-
Messages postés
31
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
24 septembre 2020
-
Bonjour

J'ai crée une Map composée de 4 couches de 121 JLabel (pour l'instant, c'est ce que j'ai trouve pour gerer les passages de perso devant et derriere des bouts de decors.)

Lorsque je passe la souris sur un de ces JLabel, je voudrais reussir a recuperer le nom de l'image qui est dedans.
A terme, je voudrais reussir a mettre dans une partie de l'ecran des icones 40x40 et en clickant dessus, puis sur un des JLabel de la map afin de donner l'icone a cette derniere, mais surtout pouvoir sauvegarder le nom de l'image qui a ete copié dans une base. Ici pour le 'fond' , il s'agit de 'herbe.png'
Mais la ou je bloque, c'est que je sais le faire quand le JLabel est nommé, mais ici, j'ai la reponse dans le mouseEntered pour la variable niveau : Cannot refer to a non-final variable niveau inside an inner class defined in a different method
meme chose pour x et y

J'attend vos suggestion avec plaisir.

Merci d'avance.

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;


import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;


public class Map
{
 private JLabel[][][] Map = new JLabel[4][11][11];
 private String NomImageJLabel;
 // plan des objets où le perso passera derrière
 private final int devant = 0;
 // plan où les personnages se déplaceront ici
 private final int milieu = 1;
 // plan ou les objets seront posés au sol
 // et les persos marcheront dessus
 private final int derriere = 2; 
 // plan ou sera le fond de l'image, herbes, routes, .....
 private final int fond = 3;
 private final int Originex = 1;
 private final int Originey = 1;
 private final int Taillex = 40;
 private final int Tailley = 40;
 private final int xMax = 11;
 private final int yMax = 11;


 private final int niveauMapMax = 4;


 public Map()
 {
  String image;
  for (int niveau = 3; niveau > -1; niveau--)
  {
   for (int x = 0; x < xMax; x++)
   {
    for (int y = 0; y < yMax; y++)
    {
     Map[niveau][x][y] = new JLabel();
     Map[niveau][x][y].setBounds(new Rectangle(Originex
       + (x * Taillex), Originey + (y * Tailley), Taillex,
       Tailley));
     Map[niveau][x][y].setVisible(true);
     try
     {
      if (niveau == fond)
      {
       image = "herbe.png";
       Map[niveau][x][y].setIcon
       (new ImageIcon(ImageIO.read(new File("./Images/" + image)),image));
      }
      else
      {
       Map[niveau][x][y].setIcon(null);
      }
     }
     catch (IOException e)
     {
      e.printStackTrace();
     }
     Map[niveau][x][y].addMouseListener(new java.awt.event.MouseAdapter()
     {
      public void mouseEntered(java.awt.event.MouseEvent e)
      {
         if (Map[niveau][x][y].getIcon() != null)
         {
            NomImageJLabel = Map[niveau][x][y].getIcon().toString();
            System.out.println(NomImageJLabel);
         }
     });
    }
   }
  }
 }

2 réponses

Messages postés
31
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
24 septembre 2020

J'ai trouve comment passer les variables au mouseEntered, en les declaration int du for par des private juste apres public class Map {

Mais il y a beau avoir eu un Map[niveau][x][y]].addMouseListener(new java.awt.event.MouseAdapter()

chaque fois que je passe la souris devant le JLabel, niveau = -1 , x=11, y=11, et ce pour tous les JLabel. ce qui entraine que Map[niveau][x][y].getIcon() est hors tableau java.lang.ArrayIndexOutOfBoundsException: -1

Je continu a chercher, mais si vous avez une idée, une remarque, je suis tout ouïe.

Merci
Messages postés
31
Date d'inscription
jeudi 24 avril 2008
Statut
Membre
Dernière intervention
24 septembre 2020

J'ai formalise mon soucis dans un applet qui ajoute les jLabels en question dans ce Zip. Mon applet

et j'obtient toujours la meme reponse lorsque je passe la souris par dessus ces JLabel :
niveau -1 x 11 y = 11

Exception in thread "AWT-EventQueue-1"

java.lang.ArrayIndexOutOfBoundsException: -1at Map$1.mouseEntered(

Map.java:76)at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.trackMouseEnterExit(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

Ce qui est 'normal' vue que ca pointe sur des valeurs hors tableau. et j'ai aucune idée du comment faire pour que chaque jLabel ait ses bonnes valeurs de niveau (0-3), x (0-10) et y(0-10)
 Si vous pouvez m'aider, je vous en remercie.