Bonjour,
J'utilise une image de fond pour une JFrame en la mettant dans un JLabel. Est-il possible d'une manière quelconque de faire glisser l'image vers le haut (de manière fluide) au clic sur l'image ?
Bonjour,
J'utilise une image de fond pour une JFrame en la mettant dans un JLabel. Est-il possible d'une manière quelconque de faire glisser l'image vers le haut (de manière fluide) au clic sur l'image ?
Salut,
Dans le principe, oui. Mais ce serait plus simple d'utiliser un JPanel, dans lequel tu dessines l'image, par drawImage, soit en faisant varier son ordonnée, soit en utilisant une translation, parce que si tu utilises un JLabel, il va falloir déplacer le JLabel, donc supprimer le layout manager de son Container, et ce n'est jamais une bonne idée de se passer de layout manager. Pour la fluidité, la classe JPanel offre une fonctionnalité de double buffering simple à activer (méthode setDoubleBuffered). Pour gérer l'animation, utilise un thread, qui fait varier la coordonnée, ou la valeur de la translation.
Un exemple de principe :
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 public class ImageScrollDemo extends JPanel { private final BufferedImage image; private int translationY; private volatile AnimationThread animationThread; /** * @throws IOException * */ public ImageScrollDemo(File imageFile) throws IOException { setDoubleBuffered(true); // évite le flickering image = ImageIO.read(imageFile); translationY = 0; } @Override public void paint(Graphics g) { super.paint(g); // l'image est afficher sur la totalité du panel, sans se préoccuper de // la déformation due à la taille du panel par rapport à la taille de // l'image g.drawImage(image, 0, translationY, getWidth(), getHeight(), this); } public boolean isAnimated() { return animationThread != null; } public void startAnimation(int speedInc) { if (animationThread == null) { animationThread = new AnimationThread(speedInc); animationThread.start(); } } public void stopAnimation() { if (animationThread != null) { animationThread.stopRunning(); } } private class AnimationThread extends Thread { private volatile boolean running; // permet de jouer/arrêter l'animation private int speedInc; /** * * @param speedInc * vitesse de translation (incrément de déplacement) */ public AnimationThread(int speedInc) { this.speedInc = speedInc; } @Override public void run() { running = true; while (running) { translationY -= speedInc; // on vait varier l'ordonnée de // l'incrément repaint(); // on informe SWING qu'on veut que l'affichage du // panel soit rafraichi if (translationY <= -getHeight()) { // on arrête l'animation quand l'image n'est plus visible // dans le panel running = false; } else { // on met en pause le thread try { Thread.sleep(33); // (33ms pour 30 images par seconde) } catch (InterruptedException e) { running = false; } } } // on arrête l'animation, // 1) on remet à zéro la position de l'image translationY = 0; // 2) pour permettre de relancer l'animation animationThread = null; // pour rafraichir l'affichage repaint(); } public void stopRunning() { interrupt(); // permet de terminer l'animation même lorsqu'elle est // en pause running = false; } } public static void main(String[] args) { try { runDemo(); } catch (IOException e) { e.printStackTrace(); } } public static void runDemo() throws IOException { JFrame frame = new JFrame("Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); File imageFile = new File( "C:/Documents and Settings/Joël/Mes documents/Mes images/avatar/suricate.carre.jpg"); final ImageScrollDemo demo = new ImageScrollDemo(imageFile); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(demo, BorderLayout.CENTER); final JSlider speedSlider = new JSlider(1, 17, 9); panel.add(speedSlider, BorderLayout.SOUTH); frame.getContentPane().add(panel); demo.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (demo.isAnimated()) { demo.stopAnimation(); } else { demo.startAnimation(speedSlider.getValue()); } } }); frame.setSize(300, 300); frame.setVisible(true); } }
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Moi qui m'attendais à une solution assez simple lol. En tout cas merci je vais me pencher là-dessus, l'exemple me sera très utile je pense.
EDIT : ton exemple est-il sensé être fonctionnel ? Car j'ai beaucoup d'erreurs.Par exemple le repaint() non défini pour le type ImageScrollDemo.AnimationThread
Tout dépend ce que tu appelles simple. Personnellement, je ne vois pas ce qu'il y a de compliqué la dedans : un redéfinition de méthode, un Thread avec une boucle super simple, et quelques composants dans une frame, avec un BorderLayout, rien que du classique. C'est sûr que si tu t'attendais à appeler une méthode scrollToUp(), il y'a un peu plus de code.
Mon code fonctionne très bien, tant qu'il n'est pas modifié. Il n'y a qu'une seule classe, qui va dans un fichier ImageScrollDemo.java : j'ai même pas mis de package en plus. La méthode repaint() appelée dans la méthode run() du thread est une méthode de JPanel (AnimationThread est une classe interne de ImageScrollDemo) : donc, oui, elle existe bien et c'est une méthode standard des composants SWING.
EDIT : Je n'ai mis aucun import, parce qu'aucun d'eux ne portait d’ambiguïté, et que les mettre chargeait inutilement le post. Tu les a bien ajoutés ?
Au cas ou :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSlider;
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Oulà autant pour moi, en adaptant ton code j'ai oublié le extends JPanel ce qui explique tout. *je suis un boulet*
Pour ce qui est de la simplicité, oui je m'attendais a une dizaine de lignes de code mais bon j'ai peut-être jugé trop vite. En même temps je ne suis pas trop familiarisé avec les threads.
En tout cas merci pour ton coup de main.
EDIT : En fait du coup j'ai un problème, ce que je comptais faire c'était mettre une image "par dessus" un formulaire et que lors du clic l'image monte en dévoilant le formulaire mais j'ai beau mettre ce que je veux dessous, lorsque l'image monte la fenetre ou le panel dessous est vierge (meme plus la couleur de background).
L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
Nouveau sur le forum ? Consultez Les Règles du Club.
Partager