ldumont
Messages postés53Date d'inscriptionlundi 21 janvier 2008StatutMembreDernière intervention 5 mars 2008
-
21 janv. 2008 à 22:46
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023
-
22 janv. 2008 à 15:32
Bonjour,
je débute en java et je cherche un moyen de créer une zone cliquable sur une image.
Je ne vois pas comment rendre une partie de l'image sensible au clic. Une fois qu'une zone sera définie il me suffira de faire un MouseListener sur la zone je pense mais comment définir cet emplacement....
Je dois concevoir un régulateur de vitesse. J'utilise une photo de tableau de bord et j'aimerais pouvoir cliquer sur le " + " par exemple présent sur le volant pour augmenter la vitesse du véhicule.
Est ce que ce que je souhaite faire est réalisable sous Java et si oui comment?
Merci d'avance
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 22 janv. 2008 à 12:52
Salut,
bah l'entraide c'est fait pour ça ^^
pour ton problème on va concerver le code ci-dessus et le modifier un chouilla de façon à permettre de ne prendre que des zones de l'image (oui, oui c'est possible et simplement en plus ^^)
public static void main(String[] args) {
new Frame().setVisible(true);
}
private static class MyCanvas extends JComponent implements MouseListener {
private static final long serialVersionUID = 8845913940083986438L;
// position de la première zone de limage que l'on veut (ici elle se trouve au pixel x=0, y=0 et s'étend sur width=10 et height=10)
private static final Rectangle ZONE_IMAGE_1 = new Rectangle(0, 0, 10, 10);
// position de la première zone de limage que l'on veut (ici elle se trouve au pixel x=100, y=100 et s'étend sur width=30 et height=20)
private static final Rectangle ZONE_IMAGE_2 = new Rectangle(100, 100, 30, 20);
// image à dessiner
private BufferedImage buff = null;
public MyCanvas(BufferedImage img) {
this.addMouseListener(this);
this.buff = img;
}
public void paintComponent(Graphics g) {
// dessine l'image
g.drawImage(buff, 0, 0, buff.getWidth(), buff.getHeight(), this);
// juste histoire de voir ou se trouvent les zones (plus facil pour le test ^^)
g.setColor(Color.GREEN);
g.drawRect(ZONE_IMAGE_1.x, ZONE_IMAGE_1.y, ZONE_IMAGE_1.width, ZONE_IMAGE_1.height);
g.drawRect(ZONE_IMAGE_2.x, ZONE_IMAGE_2.y, ZONE_IMAGE_2.width, ZONE_IMAGE_2.height);
}
private void testLocation(Point mouse, Rectangle area, String text) {
// test si la souris est dans les data de l'image
if(area.contains(mouse))
System.out.println(text + " - image");
else
System.out.println(text + " - !image");
}
public void mouseClicked(MouseEvent e) {
//récupération de la position de la souri
Point p = e.getPoint();
testLocation(p, ZONE_IMAGE_1, "mouseClicked - data 1");
testLocation(p, ZONE_IMAGE_2, "mouseClicked - data 2");
}
public void mousePressed(MouseEvent e) {
//récupération de la position de la souri
Point p = e.getPoint();
testLocation(p, ZONE_IMAGE_1, "mousePressed - data 1");
testLocation(p, ZONE_IMAGE_2, "mousePressed - data 2");
}
public void mouseReleased(MouseEvent e) {
//récupération de la position de la souri
Point p = e.getPoint();
testLocation(p, ZONE_IMAGE_1, "mouseReleased - data 1");
testLocation(p, ZONE_IMAGE_2, "mouseReleased - data 2");
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}
}
PS : pour prendre une portion d'une image tu peux utiliser la méthode suivante :
Toolkit tk = Toolkit.getDefaultToolkit();
// position de l'image à prendre dans l'image source
Rectangle rectangle = new Rectangle(100, 100, 20, 50);
// découpage d'une zones de l'image (prend juste une copie en mémoire)
Image zone1 = tk.createImage(new FilteredImageSource(img.getSource(),
new CropImageFilter(rectangle)));
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 22 janv. 2008 à 09:45
Salut,
ajoute un MouseListener sur l'objet graphique qui contient ton image et spy la zone où se trouve ton image afin de savoir si un clic est fait dessus ou non.
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
ldumont
Messages postés53Date d'inscriptionlundi 21 janvier 2008StatutMembreDernière intervention 5 mars 2008 22 janv. 2008 à 10:19
oui ça aurait pu être la solution si je voulais que toute l'image soit cliquable mais je veux seulement que quelques parties de cette image le soit.
Et ça veut dire quoi exactement " spy la zone " , je devine, mais en java je vois pas trop comment ça se code.
ldumont
Messages postés53Date d'inscriptionlundi 21 janvier 2008StatutMembreDernière intervention 5 mars 2008 22 janv. 2008 à 10:38
tu veux dire que je superpose un petit rectangle à une parcelle de mon image? Et pour trouver la bonne position je fais comment? Je cherche à taton les coordonnées en pixel? Que de questions pour un seul message.
public static void main(String[] args) {
new Frame().setVisible(true);
}
private class MyCanvas extends JComponent implements MouseListener {
private static final long serialVersionUID = 8845913940083986438L;
// image à dessiner
private BufferedImage buff = null; // data de l'image
private Raster data = null;
private void testLocation(Point mouse, String text) {
// test si la souris est dans les data de l'image
if(data.getBounds().contains(mouse))
System.out.println(text + " - image");
else
System.out.println(text + " - !image");
}
public void mouseClicked(MouseEvent e) {
//récupération de la position de la souri
Point p = e.getPoint();
testLocation(p, "mouseClicked");
}
public void mousePressed(MouseEvent e) {
//récupération de la position de la souri
Point p = e.getPoint();
testLocation(p, "mousePressed");
}
public void mouseReleased(MouseEvent e) {
//récupération de la position de la souri
Point p = e.getPoint();
testLocation(p, "mouseReleased");
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}
}
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
ldumont
Messages postés53Date d'inscriptionlundi 21 janvier 2008StatutMembreDernière intervention 5 mars 2008 22 janv. 2008 à 12:15
ton code marche nickel; c'est exactement ce que je veux, mais le seul hic, c'est que je souhaiterai que cela ne se fasse que sur une partie de mon image, que le reste de l'image soit neutre par exemple.
Je vais essayer d'expliciter un peu : ma fenetre principale est en fait un tableau de bord, avec donc le volant, les compteurs et puis un pad sur le volant, avec une touche ' + ' et une touche ' - '
Je cherche à savoir si l'utilisateur a appuyé sur la touche ' + ' par exemple pour donner l'ordre d'augmenter la vitesse, à mon régulateur de vitesse.
Mon problème réside dans la détection de l'appui sur le ' + ' ou le ' - ' qui sont deux parties distinctes de l'image.
Il faudrait que j'arrive à faire ce que tu m'as permis de faire grâce à ton code mais sur une partie restreinte de l'image. Donc je dois délimiter une zone et c'est la que je pêche.
Vraiment merci d'avoir passé du temps en tout cas, ça ma quand même fait avancer! Et puis je crois que je n'ai pas été assez claire au début.
C'est incroyable de pouvoir être aidée par de parfaits inconnus et d'une façon totalement désinteressée.
KenZara
Messages postés112Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention20 décembre 2011 22 janv. 2008 à 14:30
Je te félicite juste.
Ca fait toujours plaisir de voir les gens qui aident :) ... Et je te félicite surtout pour ta patience et ta rapidité à répondre, ce qui est une excellente chose.
Y avait rien de méchant :) ...
Bonne continuation