A voir également:
- [Java] Interface graphique n'actualise pas l'affichage
- Waptrick java football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Changer carte graphique - Guide
- Jeux java itel football - Télécharger - Jeux vidéo
- Waptrick java ✓ - Forum Mobile
1 réponse
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
19 mai 2016 à 00:32
19 mai 2016 à 00:32
Bonjour,
Le problème vient du fait que moveLeft et moveRight modifient
Remarques :
Je t'invite à ne pas faire de classes
Autre problème de conception :
Un composant n'a pas besoin d'avoir une référence de son conteneur puisqu'il connaît déjà cette information au travers de la méthode getParent()
En plus dans ton cas, tu regardes juste la taille du conteneur, alors que la taille du composant lui même pourrait te suffire.
Attention : getWidth et getHeight existent déjà pour une Frame et changer leur comportement comme tu l'as fait peut avoir des effets de oords catastrophique.
Voici une version modifiée de ton code, qui fonctionne, et avec quelques améliorations, en particulier au cas où la fenêtre serait redimensionnée.
Le problème vient du fait que moveLeft et moveRight modifient
xqui n'est utilisée que lors du constructeur, alors que pour l'affichage tu utilises persoX qui lui n'ai jamais modifié par le curseur.
Remarques :
Je t'invite à ne pas faire de classes
extends JFrame implements KeyListener, c'est une erreur de conception objet.
Autre problème de conception :
graphic = new Graphic(this);
Un composant n'a pas besoin d'avoir une référence de son conteneur puisqu'il connaît déjà cette information au travers de la méthode getParent()
En plus dans ton cas, tu regardes juste la taille du conteneur, alors que la taille du composant lui même pourrait te suffire.
Attention : getWidth et getHeight existent déjà pour une Frame et changer leur comportement comme tu l'as fait peut avoir des effets de oords catastrophique.
Voici une version modifiée de ton code, qui fonctionne, et avec quelques améliorations, en particulier au cas où la fenêtre serait redimensionnée.
import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; public class Frame extends JFrame { public Frame() { super("Test"); Graphic graphic = new Graphic(); addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: graphic.moveLeft(); break; case KeyEvent.VK_RIGHT: graphic.moveRight(); break; } } }); setSize(1000, 700); setContentPane(graphic); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } }
import java.awt.Container; import java.awt.Graphics; public class Graphic extends Container { private int width = 40, height = 50; private int x = 0; private int speed = 5; @Override public void paint(Graphics g) { super.paint(g); x = Math.max(0, Math.min(x, getWidth() - width)); int[] persoX = { x, x + width / 2, x + width }, persoY = { getHeight(), getHeight() - height, getHeight() }; g.fillPolygon(persoX, persoY, 3); } public void moveRight() { x += speed; repaint(); } public void moveLeft() { x -= speed; repaint(); } }
19 mai 2016 à 00:43
Merci :)