merci à Cincinnatus et joel.drigo
Merci pour votre réactivité et vos précieuses pistes que je vais tenter d'exploiter au mieux...
En effet, l'indexation des objets est utile car je m'en sers pour ensuite gérer ces objets au fil de l'exécution du programme.
A bientôt peut-être pour d'autres problématiques, car je manque encore de connaissances solides....:calim2:
quelques précisions à venir....
j'ai réalisé un petit test pour essayer les Maps.
J'ai trois tableaux (les listes me gènent car je travaille avec l'indexation pour retrouver mes objets ensuite...)
j'ai deux types différents : Strings et Color.
Je mets mes trois tableaux dans la map, puis je récupére le tableau de "Color" dans le tableau de type "Object" nommé "test", puis j'ajoute la couleur jaune à l'index libre (le 2).
A la fin j'affiche le conenu de "test" et de "color".
Le code est :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Color[] color = new Color[10];
String couleur[] = new String[10];
String [] nombre = new String[10] ;
// tableau "couleur" de type String
couleur[0] = "noir";
couleur[1] = "marron";
couleur[2] = "rouge";
couleur[3] = "bleu";
couleur[4] = "vert";
// tableau "nombre" de type String
nombre[0] = "zéro";
nombre[1] = "un";
nombre[2] = "deux";
// tableau "color de type Color
color[0] = Color.black;
color[1] = Color.white;
// ma map de tableaux de STrings
// 1,2,3 : clé d'accès à la valeur || couleur, nombre, color : valeur choisie (ici, c'est un tableau)
Map <String, Object[]> ma_map = new HashMap();
ma_map.put("1", couleur);
ma_map.put("2", nombre);
ma_map.put("3", color);
// ma récupération du tableau de la map dans un tableau de test
Object[] test = new Object[10];
test = ma_map.get("3");
// chercher une place libre pour mettre le "jaune" à l'index 2.
for (int i=0; i<test.length; i++) {
if (test[i]==null) {
test[i] = Color.yellow;
System.out.println("j'ai bien mis le jaune à l'index 2.");
break;
}
}
// affichage du contenu du tableau récupéré
int i = 0;
while (test[i] != null) {
System.out.println("test[" + i + "] = " + test[i] + " et color[" + i + "] = " + color[i]);
i++;
}
}
} |
le résultat est le suivant :
j'ai bien mis le jaune à l'index 2.
test[0] = java.awt.Color[r=0,g=0,b=0] et color[0] = java.awt.Color[r=0,g=0,b=0]
test[1] = java.awt.Color[r=255,g=255,b=255] et color[1] = java.awt.Color[r=255,g=255,b=255]
test[2] = java.awt.Color[r=255,g=255,b=0] et color[2] = java.awt.Color[r=255,g=255,b=0].
Cela semble fonctionner mais deux questions me gênent pourtant :
1/ A la ligne 40, je mets le tableau de "Color" de la map, dans mon tableau de test de type "Object".
Les deux types des tableaux ne sont donc pas rigoureusement identiques.
Comment se fait-il que je puisse, à la ligne 45, affecter "Color.Yellow" dans le tableau test qui est "Object" et non "Color" sans devoir faire un "cast"??
2/ A l'index 2 du tableau "test", j'ai mis la couleur jaune. A l'affichage, cette couleur apparait bien dans le "test[2], mais également dans le color[2], sans que je sois intervenu...
Cela m'arrange plutôt, car c'est le but pour moi:mouarf:, mais cet mise à jour des tableaux initiaux est-elle tout le temps automatique?...
Merci à ceux qui se pencheront sur mes interrogations....
Map avec Classe perso qui étend JComponent
Bonjour à tous, malgré vos précieux conseils, une nouvelle interrogation apparait néanmoins....
Je reste sur l'utilisation des "maps", pour essayer d'appliquer des méthodes identiques à des tableaux contenant des objets différents.
Hier, on m'a expliqué, que la classe "Object" est la mère et tous les types d'objets. L'utilisation de "map" fonctionne très bien avec les objets "natifs" du langage : Strings, Color...), notamment pour créer de nouveaux objets, sans devoir rappeler le nom de la classe (Color col = tableau[1])
Or, dans mon cas, je travaille avec des composants personnels, créés dans une classe qui étend JComponent. J'ai fait un petit code qui, crée une classe "ObjetsPerso", qui étend "JComponent".
Je créé 5 objets sur les indices de 0 à 4, avec des propriétés natives (name, taille) et perso (dureré, indice).
le code est :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComponent;
public class Main {
public static void main(String[] args) {
// Classe personnelle qui étend JComponent
class ObjetsPerso extends JComponent {
int dureté = 0;
int indice = 0;
public ObjetsPerso (int i, int dureté) {
this.dureté = dureté;
this.setSize(20, 20);
this.setName("mon_objet"+i);
this.indice = i;
}
}
// Mes tableaux de variables
Color[] color = new Color[10];
String[] couleur = new String[10];
String [] nombre = new String[10] ;
ObjetsPerso[] mesobjets = new ObjetsPerso[10];
// tableau "couleur" de type String
couleur[0] = "noir";
couleur[1] = "marron";
couleur[2] = "rouge";
couleur[3] = "bleu";
couleur[4] = "vert";
// tableau "nombre" de type String
nombre[0] = "zéro";
nombre[1] = "un";
nombre[2] = "deux";
// tableau "color de type Color
color[0] = Color.black;
color[1] = Color.white;
// tableau "mesobjets"
for (int i=0; i<5; i++) {
mesobjets[i] = new ObjetsPerso (i, 2*i);
}
// ma map de tableaux de STrings
// 1,2,3 : clé d'accès à la valeur || couleur, nombre, color, mesobjets : valeur choisie (ici, c'est un tableau)
Map <String, Object[]> ma_map = new HashMap();
ma_map.put("1", couleur);
ma_map.put("2", nombre);
ma_map.put("3", color);
ma_map.put("4", mesobjets);
// ma variable "test" contient à présent la même référence que la variable "mesobjets".
// les deux variables pointent la même zone mémoire et modifie les mêmes variables.
Object[] test = new Object[10];
test = ma_map.get("4");
// chercher une place libre dans ce tableau
for (int i=0; i<test.length; i++) {
if (test[i] != null) {
System.out.println("mesobjets[" + i + "] = " + test[i]);
}
else {System.out.println("l'index n° " + i + " est libre.");
mesobjets[i] = new ObjetsPerso (i,2*i);
// test[i] = new test(i,2*i);
break;
}
}
}
} |
J'utilise la map pour récupérer la référence de ce tableau dans la variable test, et j'affiche correctement.
Si je créé un nouveau composant perso à la suite, en précisant la classe (ligne 72), en rappelant le nom de la classe désirée, ça fonctionne très bien, rien à dire.
Cependant, que je choisis un objet de ma table, la classe sera différente à chaque fois.
Si je désire créer un nouveau composant, sans préciser la classe (ligne 73), puisque je travaille à présent sur "test" , cela ne fonctionne pas, car le compilateur me dit que la classe "test" n'est pas définie ce qui est vrai...:roll:
Il ne semble pas naturellement faire le lien entre l'objet tableau récupéré par "test" et la classe des objets contenus dans le tableau......
Question :
Quand je crée ma variable "test" qui récupère la référence vers "mesobjets" (ligne 59) via la clé "4" de la map, la classe de "mesobjets" n'est-elle pas automatiquement récupérée et liée à l'objet "test"?
L'intérêt à mes yeux de cette map est d'utiliser ensuite la même méthode pour construire mes objets, quel que soit cet objet, de type "classe JComponenet étendu".
Si je dois rappeler la classe requise pour créer l'objet, l'intérêt de cette "map" m'échappe pour les objets perso, non natifs du langage...
Cela est-il donc possible?
Merci à tous ceux qui se pencheront sur la compréhension de ma question, et à ceux qui répondront peut-être....:calim2:
1 pièce(s) jointe(s)
Merci joel.drigo, ca fonctionne!!
Juste un petit mot pour dire que la classe abstraite paramétrée fonctionne très bien!
La map récupère bien un gestionnaire spécifique directement lié au type de mon composant.
Le gestionnaire commun permet d'effectuer des routines d'attribution communes à tous mes objets et les méthodes qui utilisent les spécificités restent abstraites ici.
Chaque gestionnaire spécifique étend le gestionnaire commun et précise pour chaque type, les fonctions propres, relatives aux constructeurs et aux tableaux d'affectation.
Encore merci!!!
Je joins un aperçu de mon interface en construction :
Pièce jointe 603336
A bientôt pour d'autres difficultés...;)