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

AWT/Swing Java Discussion :

fillOval() qui ne se redessine pas.


Sujet :

AWT/Swing Java

  1. #1
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut fillOval() qui ne se redessine pas.
    Bien le bonsoir,

    Je souhaite que le dessin effectué par la méthode fillOval() suive mon curseur peu importe où il se balade (dans la limite du raisonnable).

    Après avoir mis quelques system.out.println() a des endroits stratégiques, j'apprends donc que les opérations s'effectuent correctement, mais le cercle ne se redessine pas autour de mon pointeur...

    Voici le code de la classe qui écoute:

    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
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
     
    import javax.swing.JPanel;
     
    public class Calculateur implements MouseMotionListener{
    	private int mX;
    	private int mY;
    	private int balle_y;
    	private int balle_x;
    	public Calculateur(JPanel panel){ //Composant sur lequel se rattache la classe
     
    	}
    	@Override
    	public void mouseDragged(MouseEvent e) {
    		//
     
    	}
     
    	@Override
    	public void mouseMoved(MouseEvent e) {
    		setX(e.getX());
    		setY(e.getY());
    		deplacementBalle();
    	}
     
    	private void deplacementBalle(){
    		if(mX != balle_x){
    			while(mX > balle_x){
    				balle_x++;
    			}
    			while(mY > balle_y){
     
    				balle_y++;
    			}
    			while(mX < balle_x){
     
    				balle_x--;
    			}
    			while(mY < balle_y){
     
    				balle_y--;
    			}
    		}
    		System.out.println("X: "+balle_x+"\n"
    				+" Y: "+balle_y);
    		new Panel().positionnerBalle(balle_x, balle_y);
    	}
     
    	public void setX(int mX){
    		this.mX = mX;
    	}
    	public void setY(int mY){
    		this.mY = mY;
    	}
     
    }
    Le panel qui est écouté:
    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
    import java.awt.Color;
    import java.awt.Graphics;
     
    import javax.swing.JPanel;
     
    public class Panel extends JPanel{
    	private Calculateur moteur;
    	private int balle_x;
    	private int balle_y;
    	public Panel(){
    		moteur = new Calculateur(this);
    		setSize(400, 400);
    		addMouseMotionListener(moteur);
    	}
    		public void paintComponent(Graphics g){
    			super.paintComponents(g);
     
     
    			g.setColor(Color.GREEN);
    			g.fillRect(0, 0, 400, 400);
     
    			g.setColor(Color.BLUE);
    			g.fillOval(balle_x, balle_y, 50, 50);
    		}
     
    	public void positionnerBalle(int x, int y){
    		this.balle_x = x;
    		this.balle_y = y;
    		repaint();
    	}
     
    }
    Vous m'excuserez, je n'ai rien trouvé de similaire dans la FAQ ou même dans les topics du forum.

    Je vous remercie d'avance pour vos réponses,

    Cordialement,

    Songbird.


    PS: Ces deux classes sont bien évidemment implémenter dans une JFrame avec le setContentPane() et addMouseMotionListener() qui vont bien.
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Panel().positionnerBalle(balle_x, balle_y);
    Forcément, si tu créés un nouvel Panel() pour modifier les coordonnées, elles seront modifiées dans ce nouveau Panel(), pas dans celui qui est affiché dans la JFrame !

    Tu avais bien commencé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public Calculateur(JPanel panel){ //Composant sur lequel se rattache la classe
    }
    Il suffit de stocker ce paramètre dans un attribut de la classe, et d'appeler positionnerBalle() sur cet attribut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Calculateur implements MouseMotionListener{
            /* ... */
            private Panel panel;
    	public Calculateur(JPanel panel){ //Composant sur lequel se rattache la classe 
               this.panel=panel;
            }
            /* ... */
            private void deplacementBalle(){
                 /* ... */
                 panel.positionnerBalle(balle_x, balle_y);
            }
    Par ailleurs, dans ta méthode deplacementBalle :

    1. tu testes if(mX != balle_x){. Et mY et balle_Y ? Ta balle ne se déplacera verticalement que si tu déplaces la souris horizontalement
    2. et puis c'est quoi ces boucles while ? autant faire balle_x=mx ! Voire ne pas même avoir 2 variables, mais qu'une seule.
      Et si le but est de faire un mouvement progressif (animation), on ne peut absolument pas procéder comme ça mais il faut un Timer !
    3. tu t'es trompé dans l'appel du super : au lieu de super.paintComponents(g), il faut appeler super.paintComponent(g)


    Autre remarque : au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g.setColor(Color.GREEN);
    			g.fillRect(0, 0, 400, 400);
    Tu fais [c]setBackGround(Color.GREEN) dans le constructeur de Panel : ça économisera du temps sur l'affichage, limitera le flickering, et tu n'auras pas un rectangle dimensionné en dur (donc pas forcément de la taille du panel). Remarque : pour la taille, on aurait pu faire g.fillRect(0, 0, getWidth(), getHeight()).

    Exemple pour animation :
    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
    public class Calculateur implements MouseMotionListener {
     
    	private int ballex;
    	private int balley;
    	private volatile int mx;
    	private volatile int my;
    	private final Panel panel;
     
    	public Calculateur(Panel panel) {
    		this.panel=panel;
    		Timer timer=new Timer();
    		timer.scheduleAtFixedRate(new TimerTask() {
     
    			@Override
    			public void run() {
    				deplacerBalle();
    			}
     
    		}, 5, 5); // 33 pour une animation à 30 changement par secondes
    	}
     
    	private void deplacerBalle() {
    		boolean change=false;
    		if (mx<ballex) {
    			ballex--;
    			change=true;
    		}
    		else if ( mx>ballex ) {
    			ballex++;
    			change=true;
    		}
    		if (my<balley) {
    			balley--;
    			change=true;
    		}
    		else if ( my>balley ) {
    			balley++;
    			change=true;
    		}
    		if( change ) {
    			panel.positionnerBalle(ballex, balley);
    		}
    	}
     
    	@Override
    	public void mouseDragged(MouseEvent e) {
    	}
     
    	@Override
    	public void mouseMoved(MouseEvent e) {
    		mx=e.getX();
    		my=e.getY();
    	}
     
    }
    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
    public class Panel extends JPanel {
    	private Calculateur moteur;
    	private volatile int balle_x;
    	private volatile int balle_y;
     
    	public Panel() {
    		setBackground(Color.GREEN);
    		moteur = new Calculateur(this);
    		addMouseMotionListener(moteur);
    	}
     
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		g.setColor(Color.BLUE);
    		g.fillOval(balle_x, balle_y, 50, 50);
    	}
     
    	public void positionnerBalle(int x, int y) {
    		this.balle_x = x;
    		this.balle_y = y;
    		repaint();
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().add(new Panel());
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    }
    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 expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    Merci pour ta réponse, tout d'abord.

    tu testes if(mX != balle_x){. Et mY et balle_Y ? Ta balle ne se déplacera verticalement que si tu déplaces la souris horizontalement
    J'ai fait n'importe quoi hier; Dans l'absolu il n'y avait pas besoin de boucle dans cette méthode, puisque le listener se chargeait déjà de faire appel régulièrement à elle. (Comme tu l'as montré dans ton exemple)


    et puis c'est quoi ces boucles while ? autant faire balle_x=mx ! Voire ne pas même avoir 2 variables, mais qu'une seule.
    Et si le but est de faire un mouvement progressif (animation), on ne peut absolument pas procéder comme ça mais il faut un Timer !
    Je n'en savais rien, je suis plutôt (très) mauvais avec les GUI en général. Mais on ne m'y reprendra plus ! (Pour ce genre de cas, tout du moins)

    tu t'es trompé dans l'appel du super : au lieu de super.paintComponents(g), il faut appeler super.paintComponent(g)
    Tu fais [c]setBackGround(Color.GREEN) dans le constructeur de Panel : ça économisera du temps sur l'affichage, limitera le flickering, et tu n'auras pas un rectangle dimensionné en dur (donc pas forcément de la taille du panel). Remarque : pour la taille, on aurait pu faire g.fillRect(0, 0, getWidth(), getHeight()).
    D'accord, c'est noté.
    Je te remercie pour l'exhaustivité de ton exemple (qui va m'être très utile, d'ailleurs), et encore navré pour le manque de rigueur...
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  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
    Citation Envoyé par Songbird_ Voir le message
    Je te remercie pour l'exhaustivité de ton exemple (qui va m'être très utile, d'ailleurs), et encore navré pour le manque de rigueur...
    L'exemple n'est pas complètement exhaustif : on pourrait vouloir avoir une vitesse constante de déplacement de l'oval, ce qui demande de complexifier le déplacement.
    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 expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut
    Mais il est amplement suffisant pour ce que je souhaite en faire.
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

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

Discussions similaires

  1. Composants qui ne redessine pas?
    Par Bruno13 dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2011, 12h11
  2. Interface qui ne se redessine pas
    Par delire8 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/02/2009, 11h03
  3. [trigger] ... qui ne se déclenche pas
    Par bozo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/01/2004, 11h31
  4. [MFC] Ces fenêtres qui ne s'affichent pas..
    Par Davide dans le forum MFC
    Réponses: 3
    Dernier message: 19/11/2003, 11h30
  5. [D7-EXCEL2000] Formule dans cellule Excel qui ne se calcule pas
    Par Albertolino dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/09/2003, 14h18

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