A voir également:
- [Java] Interface graphique n'actualise pas l'affichage
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Changer carte graphique - Guide
- Java apk - Télécharger - Langages
- Jeux java itel 5360 ✓ - Forum Jeux vidéo
1 réponse
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
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 :)