Bonjour,
J'ai de nombreuses images disposées sur une image de fond.
Je souhaite modifier ces images lorsque l'utilisateur passe le curseur dessus (une à la fois évidemment), ça permet de faire comprendre que quelquechose peut se passe si l'on clique sur une image (exemple : les boutons "arrêter", "redémarrer" de XP).
Chaque image est un objet et lorsque le curseur passe dessus, j'appelle une méthode propre à l'objet pour redéfinir le chemin de l'image.
L'image change, le problème c'est que c'est très lent... et je souhaite que ça soit instantané...
Ça redessine peut être toutes les images... en tout cas, moins il y a d'images, plus la modification de l'image au dessus de laquelle on place le curseur va vite...
Du coup, j'ai essayé avec repaint(x,y,w,h) et j'arrive à récupérer ces 4 arguments dans paintComponent...
=> mais le problème reste le même... plus ya d'images, plus c'est lent...
du coup,
=> j'aimerai savoir s'il est possible de récupérer ce qui devrait se trouver dans cette zone de clip ?
avant de faire le repaint(x,y,w,h), je change l'image avec les bonnes coordonnées, donc même si elle n'est pas dessinée, elle devrait être placée à cet endroit...
Je vous montre le code (tout est dans la même classe puisque les repaint() dans le MouseMoved de l'objet image ne fonctionnaient pas malgré les listener...)
Fonction qui détecte la souris et qui change l'image
les fonctions pour repaindre (spcial thanks to Bouye)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public void MouseOverItem(MouseEvent event) //version simplifiée { for(int i = 0; i < vItem.size(); i++) { //test sur les images //si le curseur est sur l'image en question if(event.getX()<=getPositionX(vItem.elementAt(i).getName())+getLargeur(vItem.elementAt(i).getPath()) & event.getX()>=getPositionX(vItem.elementAt(i).getName()) & event.getY()<=getPositionY(vItem.elementAt(i).getName())+getHauteur(vItem.elementAt(i).getPath()) & event.getY()>=getPositionY(vItem.elementAt(i).getName())) { //je précise que je bouge, ça sert dans paintComponent isMoving=true; //je teste la transparence if(alpha!=0) { //je change l'image vItem.elementAt(i).setNewImg(pathOVER,nameOVER); //vItem.elementAt(i).validate(); => avec ou sans ça change rien... repaint(vItem.elementAt(i).getX(),vItem.elementAt(i).getY(),vItem.elementAt(i).getLargeur(),vItem.elementAt(i).getHauteur()); } } } }
Du coup, ça marche, mais pas assez vite...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); Graphics g2 = g.create(); try { if (isDragging) { renderOffscreen(g2d,"dragging"); } else if(isMoving) { renderOffscreen(g2d,"moving"); } else { renderDirectly(g2 ); } } finally { g2d.dispose(); g2.dispose(); } } protected void renderOffscreen(Graphics2D g, String mode) { super.paintComponent(g); ... else if(mode.compareTo("moving")==0) { Shape clip = g.getClip(); final int sx1 = clip.getBounds().x; final int sy1 = clip.getBounds().y; final int sx2 = clip.getBounds().x + clip.getBounds().width; final int sy2 = clip.getBounds().y + clip.getBounds().height; //début du test pour trouver l'image sur laquelle on a cliquer for(int i=0; i<vItem.size();i++) { Pattern pattern_Item = Pattern.compile("^./images/Item/"); Matcher matcher_Item = pattern_Item.matcher(vItem.elementAt(i).getPath()); if(matcher_Item.find()==true) { //sur toutes les images à l'écran, on trouver celle sur laquelle on a cliqué puisque c'est celle qui a correspond a la zone de Clip if(sx2==getPositionX(vItem.elementAt(i).getName())+getLargeur(vItem.elementAt(i).getPath()) & sx1==getPositionX(vItem.elementAt(i).getName()) & sy2==getPositionY(vItem.elementAt(i).getName())+getHauteur(vItem.elementAt(i).getPath()) & sy1==getPositionY(vItem.elementAt(i).getName())) { //ouvre l'image qu'il faut (la nouvelle image) ; celle qui doit apparaitre lorsque l'on passe le curseur au dessus de l'ancienne image BufferedImage imageRepaint=null; try { imageRepaint = ImageIO.read(new File(vItem.elementAt(i).getPath())); } catch (IOException e) { e.printStackTrace(); } imageRepaint=createCompatibleImg(imageRepaint); //créé une image compatible, mais ça ne change rien à la vitesse... //but : dessiner l'image et le fond pour donner l'impression que seul l'image à changer lors su passage de la souris g.setClip(clip); //g.setComposite(AlphaComposite.SrcIn); g.setColor(new Color(134,55,83)); g.fill(clip); g.drawImage(imageRepaint, sx1, sy1, null); } } } } }
Ca vient peut être du "for" et des conditions du test pour récupérer l'image à dessiner... mais je n'ai pas vraiment le choix, parcequ'il y a différents types d'images, donc différents types d'images "survollées"...
Merci pour votre aide...
Partager