Salut,
J'aimerais dessiner un point sur une image située dans un jlabel, j'aimerais que le point soit dessiné à l'endroit où je clique avec ma souris.
Auriez vous des idées ?
Merci d'avance !
Salut,
J'aimerais dessiner un point sur une image située dans un jlabel, j'aimerais que le point soit dessiné à l'endroit où je clique avec ma souris.
Auriez vous des idées ?
Merci d'avance !
Tu nous montre le code de création du JLabel ?
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Voici le code ma page, j'aimerais que quand l'utilisateur clique sur le bouton ajouter il puisse ajouter un point sur l'image dans le jlabel.
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232 import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import javax.imageio.ImageIO; import javax.swing.*; public class FenetrePrincipale extends JFrame implements ActionListener,MouseListener { /** * */ private static final long serialVersionUID = -2914420119520760074L; private JButton BTN_OUVRIR; private JButton BTN_PRECEDENT; private JButton BTN_SUIVANT; private JButton BTN_AJOUTER; private JPanel PANEL_BTN_AJOUTER; private JPanel PANEL_BTN_SUIVANT; private JPanel PANEL_BTN_PRECEDENT; private JPanel PANEL_BTN_OUVRIR; private JPanel PANEL_IMAGE; private JLabel LABEL_IMAGE; private int nbrImage; private int imgACTIVE; private ArrayList<String> tabCheminFichier; public FenetrePrincipale(){ tabCheminFichier = new ArrayList<String>(); nbrImage = 0; imgACTIVE = 0; setExtendedState(this.MAXIMIZED_BOTH); PANEL_IMAGE=new JPanel(); PANEL_IMAGE.setLayout(null); PANEL_IMAGE.setBounds(100, 100, 1000, 1000); PANEL_BTN_OUVRIR=new JPanel(); PANEL_BTN_OUVRIR.setLayout(null); PANEL_BTN_OUVRIR.setBounds(0, 0, 200, 200); PANEL_BTN_PRECEDENT=new JPanel(); PANEL_BTN_PRECEDENT.setLayout(null); PANEL_BTN_PRECEDENT.setBounds(300, 0, 200, 200); PANEL_BTN_SUIVANT=new JPanel(); PANEL_BTN_SUIVANT.setLayout(null); PANEL_BTN_SUIVANT.setBounds(500, 0, 200, 200); PANEL_BTN_AJOUTER=new JPanel(); PANEL_BTN_AJOUTER.setLayout(null); PANEL_BTN_AJOUTER.setBounds(0, 200, 100, 50); BTN_OUVRIR = new JButton("Ouvrir"); BTN_OUVRIR.setLayout(null); BTN_OUVRIR.setBounds(0,0,100,50); BTN_AJOUTER = new JButton("Ajouter"); BTN_AJOUTER.setLayout(null); BTN_AJOUTER.setBounds(0, 0, 100, 50); BTN_PRECEDENT = new JButton("Precedent"); BTN_PRECEDENT.setLayout(null); BTN_PRECEDENT.setBounds(0,0,100,50); BTN_PRECEDENT.setEnabled(false); BTN_SUIVANT = new JButton("Suivant"); BTN_SUIVANT.setLayout(null); BTN_SUIVANT.setBounds(0,0,100,50); BTN_SUIVANT.setEnabled(false); BTN_OUVRIR.addActionListener(this); BTN_PRECEDENT.addActionListener(this); BTN_SUIVANT.addActionListener(this); BTN_AJOUTER.addActionListener(this); LABEL_IMAGE = new JLabel(); LABEL_IMAGE.setLayout(null); LABEL_IMAGE.setBounds(100,100,1000,1000); PANEL_BTN_AJOUTER.add(BTN_AJOUTER); PANEL_BTN_OUVRIR.add(BTN_OUVRIR); PANEL_BTN_PRECEDENT.add(BTN_PRECEDENT); PANEL_BTN_SUIVANT.add(BTN_SUIVANT); PANEL_IMAGE.add(LABEL_IMAGE); add(PANEL_BTN_OUVRIR); add(PANEL_BTN_AJOUTER); add(PANEL_BTN_PRECEDENT); add(PANEL_BTN_SUIVANT); add(PANEL_IMAGE); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==BTN_OUVRIR){ JFileChooser jfc = new JFileChooser(); jfc.showOpenDialog(null); File f = jfc.getSelectedFile(); if(f.exists()==true){ if(nbrImage>=1){ BTN_PRECEDENT.setEnabled(true); } nbrImage = nbrImage + 1; imgACTIVE = nbrImage; remove(LABEL_IMAGE); try { BufferedImage image = ImageIO.read(f); LABEL_IMAGE.setText("Image"+nbrImage+"Image en cours"+imgACTIVE); LABEL_IMAGE.setIcon(new ImageIcon(image.getScaledInstance(700, 800, 700))); } catch (Exception e1) { } tabCheminFichier.add(jfc.getSelectedFile().toString()); PANEL_IMAGE.add(LABEL_IMAGE); add(PANEL_IMAGE); repaint(); validate(); } } if(e.getSource()==BTN_PRECEDENT){ String chemin = tabCheminFichier.get(imgACTIVE-2); imgACTIVE=imgACTIVE-1; try { BufferedImage image = ImageIO.read(new File(chemin)); LABEL_IMAGE.setText("Image"+nbrImage+"Image en cours"+imgACTIVE); LABEL_IMAGE.setIcon(new ImageIcon(image.getScaledInstance(700, 800, 700))); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } PANEL_IMAGE.add(LABEL_IMAGE); add(PANEL_IMAGE); repaint(); validate(); if(imgACTIVE == 1){ BTN_PRECEDENT.setEnabled(false); } if(imgACTIVE != nbrImage){ BTN_SUIVANT.setEnabled(true); } } if(e.getSource()==BTN_SUIVANT){ String chemin = tabCheminFichier.get(imgACTIVE); imgACTIVE=imgACTIVE+1; try { BufferedImage image = ImageIO.read(new File(chemin)); LABEL_IMAGE.setText("Image"+nbrImage+"Image en cours"+imgACTIVE); LABEL_IMAGE.setIcon(new ImageIcon(image.getScaledInstance(700, 800, 700))); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } PANEL_IMAGE.add(LABEL_IMAGE); add(PANEL_IMAGE); repaint(); validate(); if(imgACTIVE == tabCheminFichier.size()){ BTN_SUIVANT.setEnabled(false); } BTN_PRECEDENT.setEnabled(true); } if(e.getSource()==BTN_AJOUTER){ String chemin = tabCheminFichier.get(imgACTIVE-1); BufferedImage image = null; try { image = ImageIO.read(new File(chemin)); Graphics2D g2d = (Graphics2D)image.getGraphics(); g2d.drawString("HelloWord",100,100); //LABEL_IMAGE.paintComponents(g2d); LABEL_IMAGE.setIcon(new ImageIcon(image.getScaledInstance(700, 800, 700))); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } PANEL_IMAGE.add(LABEL_IMAGE); add(PANEL_IMAGE); repaint(); validate(); } } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub // Clique gauche de la souris if(e.getButton()==MouseEvent.BUTTON1) { // Récupération de la position Point position = e.getPoint(); System.out.println("["+position.x +","+ position.y+"]"); } } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } }
D'après ton code (ligne 180), l'image est récupérée par :
c'est sur cette image que tu veux dessiner un point ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part image = ImageIO.read(new File(chemin));
de quelle taille le point (parce que un seul pixel ça va pas faire lourd) ?
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Oui l'image est bien récupéré comme ça et pour l'instant lorsque je clique sur ajouter j'écris "HelloWorld" dessus.
Je pense que le plus simple serai d'afficher un "X" en string pour simuler l'ajout d'un point.
Il faudrait donc que quand l'utilisateur clique sur ajouter, l'écran se fige jusqu'a qu'il est cliqué sur l'endroit voulu sur l'image.
En gros je veut reproduire en quelque sorte cette fonction de matlab :
[xsel,ysel] = ginput(1);
X = round(xsel); Y = round(ysel);
Tu as pensé à récupérer les coordonnées du clic de la souris :
avec cela tu peux "écrire" ton X ou mieux, dessiner 2 traits qui se croisent (ça fera plus propre ...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 LABEL_IMAGE.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { int x = evt.getX(); int y = evt.getY(); } });
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Salut,
Ce sera aussi beaucoup plus simple à placer (parce qu'un caractère ça se place par rapport à une baseline et son côté, et calculer le centre du x, même pour une police simplifiée, c'est chaud).
Par contre, je pense qu'il est beaucoup plus simple de dessiner dans une image (une copie de l'image, pour pouvoir effacer facilement au besoin) et de placer cette image dans le JLabel, que de chercher à dessiner par dessus l'image dans le JLabel (en redéfinisant une méthode paintXXX... En plus, pas besoin de mémoriser les coordonnées du point dans des variables.
Autre solution, utiliser un JLayer (mais dessiner dans une image reste quand même plus simple).
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.
Cela conviendrais si je n'avais qu'on photo, mais la l'utilisateur à la possibilité d'ouvrir plusieurs photo, je voudrais donc que les points se sauvegarde sur la photo pour que quand il puisse revenir dessus les points soit enregistré.
Mais merci pour la première solution !
Je pense avoir une idée de la solution de mon problème,
est ce que tu crois que se serais une bonne idée de créer un nouveau fichier avec la photo modifié pour ensuite pouvoir la réouvrir après?
La solution de dessiner dans l'image reste la plus simple, même si on peut aussi le faire si on dessine dans le JLabel. Peu importe en fait.
Par contre figer l'écran, tant qu'on a pas cliqué le point, ce n'est pas une bonne idée (enfin je suppose qu'il s'agit de bloquer la fenêtre, parce que bloquer l'écran ça va agacer) :
Déjà, ça ne va pas être spécialement simple à faire,
ça va plus géner qu'autre chose (on ne pourra pas abandonner si on s'est trompé en cliquant sur ajouter),
et puis si je reçois un mail urgent, je ne peux pas basculer pour aller jeter un coup d'oeil, je suis obligé de cliquer le point avant ? chez moi ça signifie "désinstallation immédiate".
et en plus je n'en vois pas l'intérêt. Pourquoi bloquer l'UI, pourquoi je ne pourrais pas bouger ma fenêtre pour la replacer pour mieux voir où je clique, genre si j'ai un reflet sur l'écran), ou n'importe
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.
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.
Parce que le problème de tout ça c'est que l'utilisateur peut ouvrir plusieurs image et à l'aide des boutons suivant et precedent, il doit pouvoir choisir l'image sur laquelle il veut dessiner un point. Et à partir du moment ou il a dessiner, les coordonnées du point doivent être enregistrer pour s'en servir après..
Je vais continuer de réfléchir ^^
Merci en tout cas !
En plus de dessiner le point, il faudrait probablement enregistrer les coordonnées quelque part (fichier texte, base de données, ...)
Ce qui serait d'ailleurs le début de la mise en place d'un système d'annulation en cas d'erreur de clic.
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager