Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : création d'une zone cliquable [ Divers / Débutant(e) ] (ldumont)

lundi 21 janvier 2008 à 22:46:32 | création d'une zone cliquable

ldumont

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

mardi 22 janvier 2008 à 09:45:43 | Re : création d'une zone cliquable

Twinuts

Membre Club Administrateur CodeS-SourceS
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 ..."

OoWORAoO

mardi 22 janvier 2008 à 10:19:30 | Re : création d'une zone cliquable

ldumont

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.

mardi 22 janvier 2008 à 10:34:15 | Re : création d'une zone cliquable

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

au plus simple, tu prends le Rectangle de ta zone (de l'image) et tu tests si la souris est dedans ou non ^^




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO

mardi 22 janvier 2008 à 10:38:44 | Re : création d'une zone cliquable

ldumont

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.

En tout cas merci de vos réponses si rapides!

mardi 22 janvier 2008 à 11:52:47 | Re : création d'une zone cliquable

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

heu nan pas exactement... voici un petit bout de code d'exemple illustrant l'idée :

les textes en gras explique ce que je voulais dire

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Frame extends JFrame {

    private static final long    serialVersionUID    = 4983727800375272097L;

    public Frame() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("img.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        setContentPane(new MyCanvas(img));

    }

    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;
       
        public MyCanvas(BufferedImage img) {
            this.addMouseListener(this);
            this.buff = img;
            this.data = img.getData();

        }
       
        public void paintComponent(Graphics g) {
            // dessine l'image
            g.drawImage(buff, 0, 0, buff.getWidth(), buff.getHeight(), this);
        }
       
        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 ..."

OoWORAoO

mardi 22 janvier 2008 à 12:15:58 | Re : création d'une zone cliquable

ldumont

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.

mardi 22 janvier 2008 à 12:52:21 | Re : création d'une zone cliquable

Twinuts

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
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 ^^)

comme taleur les modification sont en gras


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Frame extends JFrame {

    private static final long    serialVersionUID    = 4983727800375272097L;

    public Frame() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("img.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        setContentPane(new MyCanvas(img));

    }

    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 ..."

OoWORAoO

mardi 22 janvier 2008 à 13:00:55 | Re : création d'une zone cliquable

ldumont

Génial! merci, je vais essayer d'adapter ça à mon image et à mon programme mais ça devrait le faire.
Merci merci !!!

mardi 22 janvier 2008 à 13:04:29 | Re : création d'une zone cliquable

1 2

Cette discussion est classé dans : java, image, création, zone, cliquable


Répondre à ce message

Sujets en rapport avec ce message

slection avec la souris d'une zone dans l'image avec java [ par khila ] je besoin dans mon pfe d'implémenter implimenter une methode avec java qui me permet de selectionner une zone d'une image et afficher la matrice de pi enregistrer une image en Java [ par merdassiahmad ] Salut,J'ai vu les travails que vous faites,il sont tous extra-ordinaire et de même le site webest ce que vous pouvez me aider à faire un algorithme qu Problème avec getImage() [ par Akamaru88 ] Bonjour,J'ai beaucoup hésité avant de poster ce message mais je pense avoir cherché partout (y compris sur http://java.sun.com/javase/6/docs/api/ ) et java [ par djaouida27 ] salut tout le monde!!j'ai besoin de convertir ce code qui est  en builder en java:col[j][i] : une matrice qui affiche resultat .{for (i=0;i        for declaration d'une image en java [ par simeone1 ] salut tt le monde je suis un débutant en java/J2EE, et j'aimerais savoir comment declarer une image Aide Programme java [ par punisher999 ] Bonjour, Voici ce que je veux faire -Quand on ajoute une nouvelle image dans le dossier test, on doit remplir le champ "Nom Fournisseur" et cliquer su aide [ par aliahmad ] SalutImage backImage = Toolkit.getDefaultToolkit().getImage(getClass().getResource("jet_base.jpg"));au lancement de mon appli il m'affiche cet erreur: Afficher les captures d'image de la Webcam (C++ et Java) [ par trnguyendinh ] Bonjour,Pour les gens qui connaissent la librairie wxWidgets de C++, j'ai, d'un côté, un code en C++ qui contrôle ma Webcam et affiche les captures su Afficher gif animé avec java [ par julio26 ] Salut à tous,J'aimerais afficher un gif animé dans mon inteface graphique.J'ai essayé ça: g.drawImage((new ImageIcon("C:\\Image\\pianiste.gif")).getIm Comparer 2 images [ par Ashkell ] BonjourJ'aurai besoin d'une aide pour effectuer une comparaison entre une image et une autre qui vient d'etre capturée.J'ai déjà mon code pour capture


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.