Bonsoir, je teste un effet mouseEntered sur un Jlabel contenant une image.
A l'entrée de la souris se déclenche un grossissement de l'image jusqu'à une valeur limite.
Ce doit être très bref et limpide, lol.

Or, je n'y arrive pas...
J'ai lu pas mal de topics sur le double buffering, etc...
Mais je ne pense pa que ce soit ce dont j'ai besoin...

En fait j'ai remarqué que le scintillement apparait uniquement pour les images de plus grandes tailles (selon mes paramètres bien sur), et sur une cadence timer très faible...

Je pense que si je trouve une façon pour déclencher repaint() de mon label uniquement si l'image est chargée, j'aurais gagné, car à mon avis c'est juste un problème de timing : quand l'image est trop grosse ou que le timer se déclenche à intervalle trop rapprochées, l'image n'a plus le temps de se charger avant de s'afficher...

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.Timer;
import java.awt.image.BufferStrategy;
 
 
public class main_frame extends JFrame {
 
	private final JLabel label = new JLabel();
	private ImageIcon dos2;
	private BufferStrategy bs;
	private int w,h;
	private Timer time;
	private boolean painted = true;
 
	/**
         * Create the frame
         */
	public main_frame() {
		super();
		this.setSize(800,600);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		try {
			jbInit();
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
	private void jbInit() throws Exception {
		getContentPane().setLayout(null);
 
		label.setHorizontalAlignment(SwingConstants.CENTER);
		label.setBounds(0,0, 250, 250);
		w = 50;
		h = 50;
		dos2 = new ImageIcon(Toolkit.getDefaultToolkit().getImage("table_1.png").getScaledInstance(w,h,Image.SCALE_DEFAULT));
		label.setIcon(dos2);
		getContentPane().add(label);
		label.addMouseListener(new LabelMouseListener());
		time = createTimer();
	}
 
private Timer createTimer (){
		ActionListener action = new ActionListener (){
			public void actionPerformed (ActionEvent event){
				new SwingWorker<Integer, String>() {
					public Integer doInBackground(){
 
							if(h<250){
								painted = false;
								h+=4;
								w+=4;
								dos2.setImage(Toolkit.getDefaultToolkit().getImage("table_1.png").getScaledInstance(w,h,Image.SCALE_DEFAULT));
								label.setIcon(dos2);
								//label.updateUI();
								label.repaint();								
							}
							else{
								time.stop();
							}
 
 
						//repaint();
						return 0;
					}
 
				}.execute();
			}
		};
		return new Timer (30, action);
	}
	private class LabelMouseListener extends MouseAdapter {
		public void mouseEntered(MouseEvent arg0) {
			label_mouseEntered(arg0);
		}
		public void mouseExited(MouseEvent arg0) {
			label_mouseExited(arg0);
		}
	}
	protected void label_mouseEntered(MouseEvent arg0) {
		//System.out.println("Entered");
		time.start();
	} 
	protected void label_mouseExited(MouseEvent arg0) {
		//System.out.println("Exited");
		h = 50;
		w = 50;
		dos2.setImage(Toolkit.getDefaultToolkit().getImage("table_1.png").getScaledInstance(w,h,Image.SCALE_DEFAULT));
		label.setIcon(dos2);
		label.repaint();
		painted = true;
		if(time.isRunning()){
			time.stop();
		}
		repaint();
	}
 
 
}
Je suis vraiment curieux de savoir comment m'en sortir!
Merci pour votre aide