IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Interaction lors de l'appui sur une case de couleurs


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut Interaction lors de l'appui sur une case de couleurs
    Bonjour,

    Je demande a l'aide car je bloque sur une fonction de mon application java.

    Mon application java dispose d'une interface graphique d'un tableau de jeu contenant des cases de différente couleurs. Lors de l'appui sur on application je récupère grâce a un mouseListener les coordonnée de la où j'ai appuyé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    			fenetre.addMouseListener(new MouseAdapter() {
    				public void mouseClicked(MouseEvent e) {
    					int x = e.getX();
    					int y = e.getY();
    					System.out.println("X: "+x+" \t Y: "+y);
     
    				}
    			});
    Mais maintenant que je dispose de ces coordonnées, je voudrais récupérer la couleur du pixel au coordonnée( x, y ).
    Le plateau de jeu est un label auquel j'y ai appliqué une image avec la méthode setIcone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ImageIcon PlateauImage = new ImageIcon(this.getClass().getResource("trivial_plateau.png"));
    PlateauLabel.setIcon(PlateauImage);
    fenetre.getContentPane().add(PlateauLabel);
    PlateauLabel.setBounds(0,0,1000,1000);
    Je veux donc appliqué getRGB(x,y). Mais je ne sais pas comment procéder.
    Est-il possible de getRGB(x,y) sur un label ou alors sur une fenetre.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le souci est qu'un ImageIcon n'est pas censé être forcément une matrice de pixels RGB et on ne peut donc pas récupérer ses points et leur couleur. Le plus simple est de passer par un BufferedImage intermédiaire. Faire un composant spécifique hérité de JLabel qui encapsule toute la logique de conversion et le stockage de la BufferedImage, avec la gestion d’événements spécifiques pour en simplifier l'emploi :

    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
    public class ExempleImageColor {
     
    	private static final String IMAGE = "suricate.jpg";
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		ImageIconLabel imagePanel = new ImageIconLabel(ExempleImageColor.class.getResource(IMAGE));
    		JPanel colorPanel = new JPanel(new GridBagLayout());
    		JLabel label = new JLabel();
    		label.setHorizontalAlignment(JLabel.CENTER);
    		label.setPreferredSize(new Dimension(100, 100));
    		label.setMinimumSize(imagePanel.getPreferredSize());
    		colorPanel.add(label);
     
    		frame.add(imagePanel);
    		frame.add(colorPanel, BorderLayout.EAST);
     
    		imagePanel.addListener((x, y, color) -> colorPanel.setBackground(color));
    		imagePanel.addListener((x, y, color) -> label.setForeground(getContrastColor(color)));
    		imagePanel.addListener((x, y, color) -> label.setText(x + "," + y));
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	public static Color getContrastColor(Color color) {
    		double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue()) / 1000;
    		return y >= 128 ? Color.BLACK : Color.WHITE;
    	}
     
            // les classes static suivantes peuvent être extraites dans des fichiers séparés (ici, c'est juste pour avoir un ECM en un seul fichier)
    	public static interface ImageIconLabelClickListener extends EventListener {
    		void clicked(int x, int y, Color color);
    	}
     
    	public static class ImageIconLabel extends JLabel {
     
    		private BufferedImage image;
     
    		private EventListenerList eventListener = new EventListenerList();
     
    		public ImageIconLabel(URL url) {
    			this(read(url));
    		}
     
    		private static BufferedImage read(URL url) {
    			try {
    				return ImageIO.read(url);
    			} catch (IOException e) {
    				throw new UncheckedIOException(e);
    			}
    		}
     
    		public ImageIconLabel(BufferedImage image) {
    			super();
    			setImage(image);
    			addMouseListener(new MouseAdapter() {
    				@Override
    				public void mouseClicked(MouseEvent e) {
     
    					int x = e.getX();
    					int y = e.getY();
    					Color color = image==null?null:new Color(getRGB(x, y));
     
    					Arrays.stream(eventListener.getListeners(ImageIconLabelClickListener.class)).forEach(l -> {
    						l.clicked(x, y, color);
    					});
    				}
    			});
    		}
     
    		public void setImage(URL url) {
    			setImage(read(url));
    		}
     
    		public void setImage(BufferedImage image) {
    			this.image = image;
    			if ( image!=null ) {
    				super.setIcon(new ImageIcon(image));
    			}
    			else {
    				super.setIcon(null);
    			}
    		}
     
    		@Override
    		public void setIcon(Icon icon) {
    			if (icon != null) {
    				throw new UnsupportedOperationException();
    			}
    		}
     
    		public int getRGB(int x, int y) {
    			return image.getRGB(x, y);
    		}
     
    		public void addListener(ImageIconLabelClickListener listener) {
    			removeListener(listener);
    			eventListener.add(ImageIconLabelClickListener.class, listener);
    		}
     
    		public void removeListener(ImageIconLabelClickListener listener) {
    			eventListener.remove(ImageIconLabelClickListener.class, listener);
    		}
     
    	}
     
    }
    Si tu tiens à passer par un Icon ou ImageIcon, on peut toujours le convertir en BufferedImage (ça ne fonctionnera qu'avec des images compatibles forcément) :

    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
    public class ExempleImageColor {
     
    	private static final String IMAGE = "suricate.jpg";
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		ImageIconLabel imagePanel = new ImageIconLabel(new ImageIcon(ExempleImageColor.class.getResource(IMAGE)));
    		JPanel colorPanel = new JPanel(new GridBagLayout());
    		JLabel label = new JLabel();
    		label.setHorizontalAlignment(JLabel.CENTER);
    		label.setPreferredSize(new Dimension(100, 100));
    		label.setMinimumSize(imagePanel.getPreferredSize());
    		colorPanel.add(label);
     
    		frame.add(imagePanel);
    		frame.add(colorPanel, BorderLayout.EAST);
     
    		imagePanel.addListener((x, y, color) -> colorPanel.setBackground(color));
    		imagePanel.addListener((x, y, color) -> label.setForeground(getContrastColor(color)));
    		imagePanel.addListener((x, y, color) -> label.setText(x + "," + y));
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	public static Color getContrastColor(Color color) {
    		double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue()) / 1000;
    		return y >= 128 ? Color.BLACK : Color.WHITE;
    	}
     
    	public static interface ImageIconLabelClickListener extends EventListener {
    		void clicked(int x, int y, Color color);
    	}
     
    	public static class ImageIconLabel extends JLabel {
     
    		private BufferedImage image;
     
    		private EventListenerList eventListener = new EventListenerList();
     
    		public ImageIconLabel(URL url) {
    			this(read(url));
    		}
     
    		private static BufferedImage read(URL url) {
    			try {
    				return ImageIO.read(url);
    			} catch (IOException e) {
    				throw new UncheckedIOException(e);
    			}
    		}
     
    		public ImageIconLabel(BufferedImage bufferedimage) {
    			super();
    			setImage(bufferedimage);
    			addMouseListener(new MouseAdapter() {
    				@Override
    				public void mouseClicked(MouseEvent e) {
     
    					int x = e.getX();
    					int y = e.getY();
    					Color color = image==null?null;new Color(getRGB(x, y));
     
    					Arrays.stream(eventListener.getListeners(ImageIconLabelClickListener.class)).forEach(l -> {
    						l.clicked(x, y, color);
    					});
     
    				}
    			});
    		}
     
    		public ImageIconLabel(Icon icon) {
    			this(toBufferedImage(icon));
    		}
     
    		private static BufferedImage toBufferedImage(Icon icon) {
    			BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
    			Graphics g = image.getGraphics();
    			icon.paintIcon(null, g, 0, 0);
    			g.dispose();
    			return image;
    		}
     
    		public void setImage(URL url) {
    			setImage(read(url));
    		}
     
    		public void setImage(BufferedImage image) {
    			this.image = image;
    			if ( image!=null ) {
    				super.setIcon(new ImageIcon(image));
    			}
    			else {
    				super.setIcon(null);
    			}
    		}
     
    		@Override
    		public void setIcon(Icon icon) {
    			if ( icon!=null ) {
    				setImage(toBufferedImage(icon));
    			}
    			else {
    				super.setIcon(null);
    			}
    		}
     
    		public int getRGB(int x, int y) {
    			return image.getRGB(x, y);
    		}
     
    		public void addListener(ImageIconLabelClickListener listener) {
    			removeListener(listener);
    			eventListener.add(ImageIconLabelClickListener.class, listener);
    		}
     
    		public void removeListener(ImageIconLabelClickListener listener) {
    			eventListener.remove(ImageIconLabelClickListener.class, listener);
    		}
     
    	}
     
    }
    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.

  3. #3
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup avec ça je devrais m'en sortir. Dernier point je souhaite transformer l'objet color en code rgb (255,255,254 par exemple). Ceci me permettrait d'ajouter des conditions pour chaque couleurs. Je n'ai rien trouvé sur ce sujet

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si tu regardes bien la méthode suivante, tu devrais le comprendre rapidement comment obtenir les composantes sur l'objet de type Color :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static Color getContrastColor(Color color) {
    		double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue()) / 1000;
    		return y >= 128 ? Color.BLACK : Color.WHITE;
    	}
    Tu peux obtenir aussi les composantes directement par la valeur rgb, obtenue dans mon code ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int getRGB(int x, int y) {
    		return image.getRGB(x, y);
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	int red = rgb>>16 & 0xFF;
    	int green = rgb>>8 & 0xFF;
    	int blue = rgb & 0xFF;
    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.

  5. #5
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    je vois merci. Dernier point, vous pouvez m'expliquer a quoi sert le ? Color.BLACK : Color.WHITE; ou encore le image==null?null:new Color(getRGB(x, y));Je ne comprends pas trop a quoi sert le ? :

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est un opérateur ternaire. L'expression condition ? valeur1 : valeur2 vaut valeur1 si condition est vraie et valeur2 si condition est fausse.

    Autrement dit écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable = condition ? valeur1 : valeur2
    c'est comme écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ( condition ) {
        variable = valeur1;
    }
    else {
        variable = valeur2;
    }
    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.

  7. #7
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    ok merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/03/2010, 17h45
  2. Réponses: 2
    Dernier message: 23/04/2009, 09h23
  3. Réponses: 3
    Dernier message: 30/03/2009, 18h23
  4. recuperer les coordonnées de la souris lors d'un appui sur une touche
    Par haraelendil dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 22/11/2007, 13h23
  5. Réponses: 3
    Dernier message: 24/01/2005, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo