Partage
  • Partager sur Facebook
  • Partager sur Twitter

javax.swing.plaf.ColorUIResource au lieu de Color

Sujet résolu
    23 novembre 2014 à 22:02:04

    Bonsoir à tous,

    je suis un débutant en java.

    J'ai un tp à faire (pas à rendre donc ça presse pas), je vous explique.

    On doit faire un JFrame, dedans on met un JPanel (container) dans lequel on va dessiner des carrés avec des couleurs aléatoires, on peut bouger ces carrés (à l'aide de mouseInputListener, mouseMotionListener) et ceux-ci changent de couleur selon l'action de la souris (drag, click, hover).

    Et on doit afficher un petit message comme quoi on a gagné si tous les carrés sont de la même couleur (oui c'est un jeu plus que débile, mais l'intention est de s'exercer avec MouseInputListener).

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.MouseEvent;
    import java.lang.Math;
    
    class Cadre extends JFrame {
    	private JFrame fenetre = new JFrame();
    	private JPanel container = new JPanel();
    	private int nbCarre = (int)(Math.random()*10+1);//math.random()*(max + 1 - min)+min
    	private JPanel etiquette = new JPanel();
    	public Cadre(){
    		fenetre.setTitle("Cadre.java");
    		fenetre.setPreferredSize(new Dimension(600,600));
    		fenetre.setLocationRelativeTo(null);
    		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fenetre.setContentPane(container);
    		container.setLayout(null);
    		container.setBackground(Color.ORANGE);
    		for(int i = 0; i < nbCarre; i++){
    			container.add(new Carre());
    		}
    		System.out.println(nbCarre);
    		container.add(etiquette);
    		fenetre.setVisible(true);
    		fenetre.pack();
    	}
    	public void gagne(){
    		if(((Carre)container.getComponent(1)).gagner()){
    			etiquette.add(new JLabel("Gagné"));
    			this.repaint();
    			this.validate();
    		}
    	}
    	public static void main(String[] args) {
    		Cadre cadre = new Cadre();
    	}
    	class Carre extends JPanel implements javax.swing.event.MouseInputListener {
    		boolean dragging = false;
    		public Carre(){
    			double x = Math.random()*600.0;
    			double y = Math.random()*600.0;
    			double red;
    			double green;
    			double blue;
    			Color c;
    			do{
    				red = Math.random();
    				green = Math.random();
    				blue = Math.random();
    				c = new Color((float)red, (float)green, (float)blue);
    			}while(c == Color.ORANGE);
    			this.setBounds((int)x,(int)y,50,50);
    			this.setBackground(c);
    			addMouseListener(this);
    			addMouseMotionListener(this);
    			System.out.println("x : " + x + "y : " + y);
    		}
    		public void mouseMoved(MouseEvent e){
    		}
    		public void mouseDragged(MouseEvent e){
    			Point p = getParent().getMousePosition();
    			this.setLocation((int)p.getX(), (int)p.getY());
    			this.repaint();
    			dragging = true;
    		}
    		public void mouseClicked(MouseEvent e){
    			Point p = this.getLocation();
    			this.setLocation((int)p.getX(), (int)p.getY());
    			this.setBackground(Color.GREEN);
    			this.validate();
    			this.repaint();
    		}
    		public void mousePressed(MouseEvent e){
    		}
    		public void mouseReleased(MouseEvent e){
    			if(dragging){
    				Point p = getParent().getMousePosition();
    				this.setLocation((int)p.getX(), (int)p.getY());
    				this.repaint();
    				this.validate();
    				this.setBackground(Color.RED);
    			}
    			dragging = false;
    		}
    		public void mouseEntered(MouseEvent e){
    			this.setBackground(Color.BLUE);
    			gagner();
    		}
    		public void mouseExited(MouseEvent e){}
    		public boolean gagner(){
    			for(int i = 1; i < getParent().getComponentCount(); i++){
    				if(getParent().getComponent(i).getBackground() != getParent().getComponent(0).getBackground()){
    					System.out.println("pas gagné");
    					System.out.println(i + " : " +getParent().getComponent(i).getBackground());
    					System.out.println("0 : " + getParent().getComponent(0).getBackground());
    					//return false;
    				}
    			}
    			System.out.println("\n\n\n");
    			//System.out.println("gagné");
    			return true;
    		}
    	}
    }



    Voila mon code entier.

    En gros mon problème ce situe à la fin dans la méthode public void gagner(){}.

    Lorsque j'éxecute mon code et que passe ma souris sur tous les carrés on est d'accord que tous les carrés sont de couleurs bleus, ça ya pas de soucis. Dans le terminal, on a tous les tests qui s'affiche à chaque fois que je passe la souris sur un carré.

    Tous va bien jusqu'au dernier de dernier indice, l'appel de la fonction getBackground() renvoie une couleur de type 

    javax.swing.plaf.ColorUIResource[r=238,g=238,b=238]

    au lieu de 

    java.awt.Color[r=0,g=0,b=255]

    c'est assez dérangeant étant donné qu'à cause de cela je ne peux pas gagner le jeu et donc finir ce tp...

    Merci de m'éclairer !

    Merci d'avance !

    Bonne soirée à tous !

    Gauthier.



    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2014 à 23:12:11

      La JFrame contient un composant supplémentaire, le root pane. Plus d'info sur le site d'Oracle https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html#rootpane

      Dans ton cas, vérifie juste que l'objet renvoyé par getBackground soit une instance de java.awt.Color avec instanceof.

      Et ligne 92, utilise la fonction equals plutôt que l'opérateur != . Pareil ligne 51.

      Bonne soirée :)

      -
      Edité par tvere 23 novembre 2014 à 23:19:26

      • Partager sur Facebook
      • Partager sur Twitter
        24 novembre 2014 à 21:53:04

        Merci beaucoup pour ton aide !

        J'ai résolu le problème :

        public boolean gagner(){
        			for(int i = 1; i < getParent().getComponentCount()-1; i++){ 
        			// getComponentCount()-1 car le dernier item n'est pas un carré mais de type JPanel
        				if(getParent().getComponent(i).getBackground() instanceof java.awt.Color){
        					if(!(getParent().getComponent(i).getBackground().equals(getParent().getComponent(0).getBackground()))) {
        					//si il y a un composant qui n'est pas de la même couleur que le premier alors tous les composants ne sont pas de la même couleur
        						System.out.println("pas gagné");
        						System.out.println(i + " : " +getParent().getComponent(i).getBackground());
        						//System.out.println(getParent().getComponent(i));
        						System.out.println("0 : " + getParent().getComponent(0).getBackground());
        						return false;
        					}
        				}
        				else{
        					System.out.println("not instanceof color");
        					return false;
        				}
        			}
        			System.out.println("\n\n");
        			System.out.println("gagné");
        			//System.out.println(getParent().getComponent(getParent().getComponentCount()-1));
        			return true;
        		}

        j'ai tout simplement mis -1 à la boucle for (ligne 2) pour éviter de l'avoir :D

        ensuite pour le instanceof ça marche pas, javax.swing.plaf.ColorUiResource est considéré comme instanceof Color :/

        Je met pas tout de suite le sujet en résolu, car je vais peut être encore avoir besoin de votre aide :D

        Bonne soirée !

        • Partager sur Facebook
        • Partager sur Twitter

        javax.swing.plaf.ColorUIResource au lieu de Color

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown