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

Graphisme Java Discussion :

P.b Sprite et mousseListner : tout ce déplace en même temps


Sujet :

Graphisme Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut P.b Sprite et mousseListner : tout ce déplace en même temps
    Slt,
    Je veux créer un jeux de domino. J'ai crée ma class Domino et une class Sprite pour mieux gérer les déplacements de mé domino. Mais voila :
    je voudrais déplacer mon Sprite à l'aide la souris mais ça fonctionne pas
    Au lieu de bouger mon domino il bouge mon plateau (tapis)
    voici le code de mon sprite :

    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
     
     
       public class Sprite 
    {
     
      protected Rectangle rectangle;
      //Emplacement du sprite
      private int x,y;
      private Image image;
      //Indique si le sprite est visible
      private boolean visible=true;
      public static final int DEFAULT_SPRITE_WIDTH=25;
      public static final int DEFAULT_SPRITE_HEIGHT=50;
     
      /**
       * Crée le sprite
       */
      public Sprite(Image image,int x,int y)
      {
        this.image=image;
        this.x=x;
        this.y=y;
        int width=DEFAULT_SPRITE_WIDTH;
        int height=DEFAULT_SPRITE_HEIGHT;
        rectangle=new Rectangle(x, y, width, height);
      }
     
     
      /* Renvoie la visibilité du sprite
       */
      public boolean estVisible()
      {
        return visible;
      }
     
      /**
       * Change la visiblité du sprite
       */
      public void setVisible(boolean visible)
      {
        this.visible=visible;
      }
    voici le code d'affichage
    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
     
    Tapis(Joueur[] joueurs) {
     
        lesjoueurs = joueurs;
        dominoV = new ImageIcon("C:\\image\\00.jpg");
        essai=new JLabel(dominoV);
        setLayout(null);
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
     
      }
     
     
      /*********************************************************
     *        Partie actionlistener
     ********************************************************/
     
     public void mouseReleased(MouseEvent e) {
     
     
    setLocation( currentX,  currentY);
     repaint();
        }
     
        public void mouseEntered(MouseEvent e) {
        }
     
        public void mouseExited(MouseEvent e) {
     
    }
     
    //pour puvoir faire bouger l'objet je detecte si j'ai bien clické sur un objet
        public void mousePressed(MouseEvent e) {
        AncienAbs = e.getX();
        AncienOrd = e.getY();
     
        }//fin mousePressed
     
     
     
        // un click de bouton ajoute un rectangle dans la liste et 
    // le repaint le dessine 
        public void mouseClicked(MouseEvent e) {
         System.out.println("Clic en [" + e.getX() +
                             ", " + e.getY() + "]");
        }
     
     
        public void mouseMoved( MouseEvent e ){
        }
     
     
       public void mouseDragged( MouseEvent e )
       {
           currentX = e.getX();
           currentY = e.getY();
     
            System.out.println("IMAGE_MANIP - Dragged at x="+currentX+" y="+currentY);
            repaint();
       }
     
    /*********************************************************
    *               la partie de l'affichage
    **********************************************************/
    //  @Override
      public void paint(Graphics g) {
        super.paintComponent(g);
     
        Graphics2D g2d = (Graphics2D) g;
        //affichage du tapis
        File fichier0=new File("C:\\image\\Tapis.gif");
          try{
         image = ImageIO.read(fichier0);
      }catch(IOException e){
                return;
      }
        g2d.drawImage(image, 0, 0, null);
     
        //jeu du joueur sud 
     
     
        int posx = 175;
        int posy = 550;
        int nb = lesjoueurs[0].main.size();
     
         for (int v = 0; v < nb; v++) { 
          Domino ledomino =(Domino)lesjoueurs[0].main.get(v); 
          if (ledomino!=null){
         Image image=ledomino.getImage();
          Sprite img=new Sprite(image,posx,posy);
           g2d.drawImage(image, posx,posy,null);
                posx = posx + 25; 
          }
        }
    Si une personne aurait une explication elle sera la bien venu

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    public void mouseReleased(MouseEvent e) {
    setLocation( currentX, currentY);
    repaint();
    }
    C'est normal, ici tu modifies la position du tapis avec setLocation.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Je daccord avec toi mais je n'arrive pas à trouver la commande exact pour que ce soit les dominos qui bougent. C la l'objet de ma question

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 864
    Points : 22 910
    Points
    22 910
    Billets dans le blog
    51
    Par défaut
    Dans ce cas ta question initiale etait mal posee.

    A la reception de l'evenement de pression de bouton de la souris, tu parcoures ta liste de dominos pour trouver celui se trouvant aux coordonnees X, Y. Ce domino, s'il y en a un, devient le domino courant/selectionne et tu reaffiche. Lors que la souris est tiree a travers le tapis, tu met a jour les coordonnees X, Y du domino courant (s'il existe) et tu reaffiche. Lorsque la souris est relachee, tu positionee une derniere fois ton domino selectionne (s'il existe) et nullifie la reference du domino courrant (il n'y a alors plus de domino selectionne) et reaffiche...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Ben ! j'y ai pensé mais il me faudrait faire un calcul du style lors d'un clic[si e.getx se trouve entre le x et gety se trouve entre le y d'un objet de ma liste de domino : retouner] et je trouve ça trop long. c'est pour cela que je voulais utiliser un sprite et ensuite mettre un sprite _cursor (hidden) sous le curseur de la souris et ensuite la détection d'une collision entre _cusor et un sprite(domino) me renvera l'id de ce dernier.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 864
    Points : 22 910
    Points
    22 910
    Billets dans le blog
    51
    Par défaut
    Je n'ai rien compris a ce que tu explique sur la fin, mais je ne vois pas en quoi le parcours de la liste de domino pour trouver sur lequel tu es est long (meme si c'est pour changer le curseur). Ces parcours sont facilites par l'utilisation judicieuse et astucieuse des boites enblogantes rectangulaires des objets qui permettent d'eviter de faire des calculs de collision fastidieux (nottament si les images formant tes dominos ne sont justement pas de forme rectangulaire mais contiennent des parties vides/transparentes supposees ne pas appartenir au domino lui-meme).

    Le(s) seul(s) moment ou tu dois reellement utiliser un algorithme de collision de sprite, c'est quand tu es effectivement a l'interieur de la boite enblobante d'un domino. Les methodes permettant de determiner si on se trouve a l'interieur d'une surface rectangulaire (les methodes contains(), intersects(), etc... d'un Rectangle ou d'un Rectangle2D) s'executent rapidement et surtout... existent deja (dans les classe metionnees).

    Quand a la detection elle-meme, une fois dans la boite englobante, tu as divers methodes a ta disposition, comme verifier le niveau de transparence du pixel de l'image du domino ou joindre une image masque opaque (2 couleur N&B) a celle du domino permettant de specifier quand on se trouve dedans ou dehors).

    Reste la colision, pour eviter qu'un domino ne "rentre" dans un autre. La il faudra chercher un peu plus en avant avec ce qui se fait deja dans les jeux videos.

    Encore une fois le but n'est pas d'eviter de parcourir la liste (ou l'arbre) mais de restreindre les calculs lourds aux endroits ou on en a reellement besoin.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    oauis, la question de parcourir la liste ne ce pose pas. Je voudrais "simplement" créer un deuxième pointeur qui aurait une image (invisible). Cette image aurait la forme d'un carré. Pourquoi créer ce deuxième pointeur ? :

    1) une plus grande précision pour le clic
    2) Cette image qui sera en réalité un sprite, me permettra de faire détection de collision entre le deuxième pointeur de la souris(un sprite) et les autres sprites. Ainsi j'aurrai la id du sprite en collision et ainsi que ces coordonnées.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    au faite ce serait superposer une autre image sur celle du pointeur de la souris

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 864
    Points : 22 910
    Points
    22 910
    Billets dans le blog
    51
    Par défaut
    Pour changer le curseur de la souris, il suffit de changer le Cursor du panel (sauvegarder le precedent pour le restaurer une fois l'operation finie). Il existe des methodes te permettant de creer tes propres Cursor. Tu peux donc essayer de creer un Cursor utilisant l'image du domino. Attention cependant les Cursor ont des limitations qui dependent largement de l'OS (sur certains OS on ne peut utiliser que des images en 256 couleurs ou uniquement en niveau de gris - si on utilise des images non-supportees le rendu du curseur est bizarre ou degrade).

    Une autre methode consiste a mettre un Cursor vide (en utilisant une image de 1x1 pixel transparent) et a afficher le domino au meme endroit que la souris a la fin de ta boucle de rendu.

    Enfin une methode assez souvent utilisee par Gfx est de ne pas toucher la methode de rendu mais de d'afficher l'image du domino via le glasspane de la frame. L'avantage c'est que le domino s'affiche sur toute la frame et non pas uniquement dans le panel.

    Note : dans le cas d'un reel drag'n drop utilisant l'API fournie (TransfertHandler, etc... dnd vers des composants ou le systeme et vice-versa) il existe une methode sensee permettre de modifier l'aspect du curseur pour donner un feel visuel du drag en cours mais notoirement cette methode ne fonctionne pas (elle ne fait rien, le curseur ne change pas et utilise celui du drag par defaut) sur les JVM 1.5- (et je n'ai pas teste si ca marchait sur les JVM 1.6+). En plus de toute maniere tu n'utilises pas l'API de dnd (et n'a pas besoin de l'utiliser pour ton jeu).

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    je capitule, pour la recherche de mon domino cliked

    je faire comme tu m'avait indiqué la première fois. Je vais écouter le conseil que tu as mis sur un autre sujet à savoir :

    Dans le cas où un des rectangle est contenu dans l'autre, le plus facile serait de trouver les objets java.awt.geom.Rectangle2D qui contiendraient ces rectangles de d'appliquer contains(double x, double y, double w, double h).]
    Pour qu'un un segment S1 soit en intersection avec un autre (S2), il faut que :
    le point d'intersection [d'ordonnée : x0=(b2-b1)/(a1-a2) et d'absisse y0=a1*x0+b1] appartienne à l'intervalle de S1 et aussi à l'intervalle de S2.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Parcontre, j'ai un autre souci avec mes images. J'ai utilisé la methode la "class Actor" sur le site que tu as conseillé. Mais quand je fais un évèment style : dragged, réduction de la fenêtre, toute mes images disparaissent.

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 864
    Points : 22 910
    Points
    22 910
    Billets dans le blog
    51
    Par défaut
    Hum ca doit pas etre moi qui ait ecris ca (ou alors il y a pas mal de temps ) car j'ai tellement la tete vide apres toutes ces annees de Swing et d'interface graphique que je serai bien en peine d'ecrire l'equation d'une droite et la resolution de l'intersection de deux segments sans avoir a faire de serieuses recherches avant (meme si c'est un probleme simple)...

    Sans code a tester difficile de savoir d'ou vient le probleme.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    au fil temps mon problème se transforme
    Alors voila j'ai décidé de créer un seul domino pour mieux controler mon programme

    voici le code graphique du domino :
    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
     
    public class Rectangledom extends JPanel{
      Rectangle2D surface;
      protected double x, y, largeur, hauteur;
      Rectangle(double valX, double valY,
                 double valL, double valH) {
        x = valX; 
        y = valY; 
        largeur = valL;
        hauteur = valH;   
      }
      void setPosition(double valX, double valY){
        x = valX;
        y = valY;
      }
      public Rectangle getBounds()
      {
        return new Rectangle((int)x,(int)y,(int)largeur,(int)hauteur);
      }
      boolean estDans(double valX, double valY){ // c'est ma version de contains
        return ((x<=valX)&&(x+largeur>=valX)
               &&(y<=valY))&&(y+hauteur>=valY);
      }
     
     // je génère un domino 
      void dessiner(Graphics g) {
        Graphics2D g2 =(Graphics2D) g;
        g2.setColor(Color.black);
        g2.setStroke(new BasicStroke(2));
        surface =new Rectangle2D.Double(x,y, 
                largeur,hauteur);
        g2.fill(this.surface);
         g2.setColor(Color.red) ;
         g2.fillOval((int)x+2,(int)y+2,5,5); //en haut a gauche
         g2.fillOval((int)x+2,(int)y+17,5,5);// en bas a gauche
         g2.fillOval((int)x+17,(int)y+2,5,5);//en haut a droite
         g2.fillOval((int)x+17,(int)y+17,5,5); // en bas a droite
         g2.fillOval((int)x+10,(int)y+10,5,5); // au milieu 
         g2.setColor(Color.white) ;
         g2.fillOval((int)x+10,(int)y+22,5,5); // au milieu centre
         g2.setColor(Color.red) ;
         g2.drawLine((int)x+24,(int)y+25/*hauteur depart*/,(int)x+1,(int)y+25/*hauteur fin*/) ;
     
     
      }
    }
    voici mon code principale :

    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
     
    public class Prog38 extends Applet implements WindowListener,MouseMotionListener,MouseListener {
      Rectangledom rect1;
      //Sprite sprite;
      boolean clicRect1, clicRect2;
      public void init() {
        rect1 = new Rectangledom(30.0,30.0,25.0,50.0);
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
     
        clicRect1 = false;
     
     
      }
      public void paint(Graphics g) {
          rect1.dessiner(g);
            // sprite.dessiner(g);
     
      }
      public void mouseClicked(MouseEvent e){
        int x,y;
        x = e.getX();
        y = e.getY();
        if (rect1.estDans(x,y)) 
          clicRect1=true;
          System.out.println(clicRect1); // je test en affichant le résultat
          System.out.println(x+" et "+y);//il est toujours a false 
        /*if (rect2.estDans(x,y)) 
          clicRect2=true;*/
      }
     
      public void mousePressed(MouseEvent e){
        int x,y;
        x = e.getX();
        y = e.getY();
       /*if (rect1.estDans(x,y)) 
          clicRect1=true;
        /*if (sprite.estDans(x,y)) 
          clicRect2=true;*/
      }
      public void mouseDragged(MouseEvent e){
        int x,y;
        x = e.getX();
        y = e.getY();
       if (clicRect1==true) {
          rect1.setPosition(x,y);
          repaint();
       }/*
        if (clicRect2==true) {
          sprite.setPosition(x,y);
          repaint();
        }*/
      }
      public void mouseReleased(MouseEvent e){
      if (clicRect1)
          clicRect1=false;
       /* if (clicRect2)
          clicRect2=false;*/
      }
     
      //Listener
       ....
     
     //WindowsAdapter 
     
      ...
       public void windowClosing(WindowEvent e) {
          System.exit(0);
       }
     
       ...   
    public static void main(String[] args) {
          Prog applet = new Prog();
          Frame frame = new Frame("Applet");
          frame.addWindowListener(applet);
          frame.add("Center", applet);
          frame.setSize(350, 250);
          frame.show();
          applet.init();
          applet.start();
     
       }
    }

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    je n'avais pas utiliser de MouseListerne

    en surfant dur le forum j'ai lus que du tu disait qu'il était impossible "de base" de mettre un Actionlistener sur un Rectangle2D. Mais MouseListener était possible. "SUjet :Mettre Actionlistener sur Rectangle2D et dimensioner JFrame à la date du 29/11/2005 à 22h52" je sais c'est vieux

    Ma question : comment faire un Drag sur ce foutu rectangle . C'est la base de mon programme et j'y arrive pas. Sans ça je ne peux pas avancer.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut précision
    Quand je mets le test boolean clicRect1 = true; le rectangle se déplace

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    ok j'ai trouvé j'avais mélangé des réels avec des entiers. Merci Bouyé pour ton aide

  17. #17
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 864
    Points : 22 910
    Points
    22 910
    Billets dans le blog
    51
    Par défaut
    Zut, pile poil quand je m'etais amuse a faire un code d'exemple

    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
    package test;
     
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.font.*;
    import java.awt.geom.*;
    import javax.swing.*;
    import javax.swing.event.*;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2006</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class TestMoveRectangle extends JPanel implements MouseInputListener, ComponentListener {
      /** Panel gradient.
       */  
      private GradientPaint gradient;
     
      /** Shape to paint.
       */  
      private Rectangle p1 = new Rectangle(100, 100, 200, 100);
     
      /** Shape stroke.
       */  
      private BasicStroke stroke = new BasicStroke(2.0f);
     
      /** Shape background.
       */  
      private Color background = new Color(Color.CYAN.getRed(), Color.CYAN.getGreen(), Color.CYAN.getBlue(), 60);
      /** Shape foreground.
       */  
      private Color foreground = Color.CYAN.darker();
     
      /** Mouse current reference point.
       */  
      private Point refPoint;
     
      /** Creates a new instance.
       */  
      public TestMoveRectangle() {
        addComponentListener(this);
        addMouseListener(this);
        addMouseMotionListener(this);
        createGradient();
      }
     
      /**
       * {@inheritDoc}
       */
      @Override public Dimension getMinimumSize() {
        Insets insets = getInsets();
        return new Dimension(insets.left + insets.right + p1.width, insets.top + insets.bottom + p1.height);
      }
     
      /**
       * {@inheritDoc}
       */
      @Override public Dimension getPreferredSize() {
        return getMinimumSize();
      }
     
      /** Create gradient.
       */  
      private void createGradient() {
        Insets insets = getInsets();
        Dimension size = getSize();
        gradient = new GradientPaint(0, insets.top, Color.BLACK, 0, insets.top + (size.height - insets.bottom), Color.BLUE);
      }
     
      /** Constrain rectangle within panel.
       */  
      private void constrainWithinBoundaries() {
        Insets insets = getInsets();
        Dimension size = getSize();
        p1.x = Math.max(insets.left, p1.x);
        p1.x = Math.min(size.width - insets.right - p1.width, p1.x);
        p1.y = Math.max(insets.top, p1.y);
        p1.y = Math.min(size.height - insets.bottom - p1.height, p1.y);
      }
     
      /** Repaint optimization.
       */  
      private void repaintArea() {
        Shape shape = stroke.createStrokedShape(p1);
        Rectangle bounds = shape.getBounds();
        repaint(bounds.x - 1, bounds.y - 1, bounds.width + 2, bounds.height + 2);
      }
     
      /**
       * {@inheritDoc}
       */
      @Override protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Insets insets = getInsets();
        Dimension size = getSize();
        Graphics2D g2d = (Graphics2D) graphics.create();
        try {
          g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
          g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
          g2d.setPaint(gradient);
          g2d.fillRect(insets.left, insets.top, size.width - (insets.left + insets.right), size.height - (insets.top + insets.bottom));
          g2d.setColor(background);
          g2d.fill(p1);
          g2d.setStroke(stroke);
          g2d.setColor(foreground);
          g2d.draw(p1);
        }
        finally {
          g2d.dispose();
        }
      }
     
      /** Self-test main.
       *  @param args Arguments from the command-line.
       */
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          /**
           * {@inheritDoc}
           */
          public void run() {
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(new TestMoveRectangle(), BorderLayout.CENTER);
            frame.setSize(500, 400);
            frame.setVisible(true);
          }
        });
      }
     
     
      /**{@inheritDoc}
       */
      public void mouseClicked(MouseEvent event) {}
     
      /**{@inheritDoc}
       */
      public void mousePressed(MouseEvent event) {
        if (p1.contains(event.getX(), event.getY())) {
          refPoint = new Point(event.getX(), event.getY());
        }
      }
     
      /**{@inheritDoc}
       */
      public void mouseReleased(MouseEvent event) {
        refPoint = null;
      }
     
      /**{@inheritDoc}
       */
      public void mouseEntered(MouseEvent event) {}
     
      /**{@inheritDoc}
       */
      public void mouseExited(MouseEvent event) {}
     
      /**{@inheritDoc}
       */
      public void mouseDragged(MouseEvent event) {
        if (refPoint != null) {
          repaintArea();
          int dx = event.getX() - refPoint.x;
          int dy = event.getY() - refPoint.y;
          p1.x += dx;
          p1.y += dy;
          constrainWithinBoundaries();
          refPoint.x = event.getX();
          refPoint.y = event.getY();
          repaintArea();
        }
      }
     
      /**{@inheritDoc}
       */
      public void mouseMoved(MouseEvent event) {
      }
     
      /**{@inheritDoc}
       */
      public void componentResized(ComponentEvent event) {
        createGradient();
        constrainWithinBoundaries();
        repaint();
      }
     
      /**{@inheritDoc}
       */
      public void componentMoved(ComponentEvent event) {}
     
      /**{@inheritDoc}
       */
      public void componentShown(ComponentEvent event) {}
     
      /**{@inheritDoc}
       */
      public void componentHidden(ComponentEvent event) {}
     
    }

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Ben ça marche pas ton code avec le j2sdk1.4.2_14 et JCreator

    Parcontre toi tu t'amuse à faire des codes et moi je souffre

    c'est fou quand on n'est pas doué pour quelque chose

  19. #19
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Normal il utilise des annotations qui ont été rajoutées en java 5.

    Et pour ce qui est du fait de s'amuser on va juste dire que c'est un vieux de Swing le monsieur...

    Et donc que ce genre de choses coule de source chez lui...

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Ouais c bien pour cela que j'ai précisé ma version de jdk.

    Tien pendant que je t'ai Mr SInok :

    Je voudrais créer liste de rectangles. J'utilise Map, liste ?

Discussions similaires

  1. Grant sur toutes les tables en même temps
    Par jer64 dans le forum SQL
    Réponses: 3
    Dernier message: 25/09/2006, 07h59
  2. Réponses: 9
    Dernier message: 14/12/2005, 21h05
  3. [JFrame] Désiconifier toutes les autres fenêtres en même temps
    Par stoukou dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 07/10/2005, 12h01

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