Dans le cadre de la réalisation d'un jeu Pong en Java, j'ai écrit le code suivant qui devrait afficher les objets que je souhaite et permettre d'utiliser certains touches du clavier pour bouger les rectangles. Il se trouve cependant que j'ai droit à une fenêtre magnifiquement blanche comme si le paintComponent était ignoré ... J'utilise NetBeans 8.1 qui ne m'indique aucune erreur dans le code (d'ailleurs le programme se lance bien sans aucune erreur et le JFrame s'ouvre à la taille souhaitée). Quelqu'un aurait-il des idées ?
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class PongEvolution extends JPanel implements ActionListener, KeyListener {
Timer tm = new Timer(5, this);
// Déclaration des largeurs
int x = getWidth();
int x2 = getWidth() / 2;
int x8 = getWidth() / 8;
int x15 = getWidth() / 15;
int x25 = getWidth() / 25;
// Déclaration des hauteurs
int y2 = getHeight() / 2;
int y3 = getHeight() / 3;
int y4 = getHeight() / 4;
int y8 = getHeight() / 8;
int y15 = getHeight() / 15;
// Déclaration position et vitesse initiale
int rectangle1 = (y2 + y3) / 2, rectangle2 = (y2 + y3) / 2, velY1 = 0, velY2 = 0;
// Déclaration dimensions rectangle
int rectangleWidth = x25;
int rectangleHeight = y4;
public PongEvolution() {
tm.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Affichage du texte
String text1 = "Pong Evolution";
Font currentFont = g.getFont();
Font newFont = currentFont.deriveFont(currentFont.getSize() * 2F);
g.setFont(newFont);
g.drawString(text1, x2 - ((g.getFontMetrics().stringWidth(text1)) / 2), y8);
// Affichage boule
int pixelsBall = (x15 + y15) / 2;
g.fillOval((x2 - (pixelsBall / 2)), (y2 + y3) / 2 + pixelsBall, pixelsBall, pixelsBall);
// Affichage rectangles
g.fillRect(x8, rectangle1, rectangleWidth, rectangleHeight);
g.fillRect((x - x8 - rectangleWidth), rectangle2, rectangleWidth, rectangleHeight);
}
@Override
public void actionPerformed(ActionEvent e) {
if (rectangle1 < y4 || rectangle1 > 3 * y4 || rectangle2 < y4 || rectangle2 > 3 * y4) { }
else {
rectangle1 += velY1;
rectangle2 += velY2;
repaint();
}
}
@Override
public void keyPressed(KeyEvent e) {
int c = e.getKeyCode();
if (c == KeyEvent.VK_UP) {
velY2 = -1;
}
if (c == KeyEvent.VK_DOWN) {
velY2 = 1;
}
if (c == KeyEvent.VK_Z) {
velY1 = -1;
}
if (c == KeyEvent.VK_S) {
velY1 = 1;
}
}
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void keyReleased(KeyEvent e) {
velY1 = 0;
velY2 = 0;
}
public static void main(String[] args) {
JFrame window = new JFrame("Pong Evolution");
window.setSize(800, 600);
window.setLocationRelativeTo(null);
window.add(new PongEvolution());
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
Merci pour ta réponse rapide Nox mais malheureusement ça ne change rien (pourtant je suis sur que c'est un petit truc comme ça qui n'est pas bien defini) ...
Tu as appellé les méthodes getWidth() et getHeight() lors de l'initialisation de tes variables.
Or ta fenêtre n'est pas encore initialisé. Il faut donc que tu les mettent à jours dans une méthode qui sera appellé après que tes composants aient été dessinés. Par exemple tu peut appeller une méthode:
Init_var();
à la fin de la méthode paintComponent (ligne 60-61)
Excellente idée (comment je n'ai pas pu y penser ) ! Merci Nox (tu as été parfaitement compréhensible) et tout s'affiche comme il faut à présent.
Mais tout aurait été trop beau s'il n'y avait pas un bémol là aussi ... Maintenant les rectangles ne veulent pas bouger (en fait je vois que quand j'appuie sur les touches correspondantes, le rectangle bouge légèrement mais c'est comme s'il était empêché ou que les positions étaient réinitialisées juste derrière). Est-ce que le fait d'appeler cette méthode Init_var() à chaque fois dans le PaintComponent ne bloque-t-elle justement pas le mouvement ?
Je remet le code avec les mises à jour :
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class PongEvolution extends JPanel implements ActionListener, KeyListener {
Timer tm = new Timer(5, this);
public void Init_var()
{
// Réinitialisation des largeurs
x = getWidth();
x2 = getWidth() / 2;
x8 =getWidth() / 8;
x15 = getWidth() / 15;
x25 = getWidth() / 25;
// Réinitialisation des hauteurs
y2 = getHeight() / 2;
y3 = getHeight() / 3;
y4 = getHeight() / 4;
y8 = getHeight() / 8;
y15 = getHeight() / 15;
// Réinitialisation position et vitesse initiale
rectangle1 = (y2 + y3) / 2;
rectangle2 = (y2 + y3) / 2;
velY1 = 0; velY2 = 0;
// Réinitialisation dimensions rectangle
rectangleWidth = x25;
rectangleHeight = y4;
}
// Déclaration des largeurs
int x = getWidth();
int x2 = getWidth() / 2;
int x8 = getWidth() / 8;
int x15 = getWidth() / 15;
int x25 = getWidth() / 25;
// Déclaration des hauteurs
int y2 = getHeight() / 2;
int y3 = getHeight() / 3;
int y4 = getHeight() / 4;
int y8 = getHeight() / 8;
int y15 = getHeight() / 15;
// Déclaration position et vitesse initiale
int rectangle1 = (y2 + y3) / 2, rectangle2 = (y2 + y3) / 2, velY1 = 0, velY2 = 0;
// Déclaration dimensions rectangle
int rectangleWidth = x25;
int rectangleHeight = y4;
public PongEvolution() {
tm.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Affichage du texte
String text1 = "Pong Evolution";
Font currentFont = g.getFont();
Font newFont = currentFont.deriveFont(currentFont.getSize() * 2F);
g.setFont(newFont);
g.drawString(text1, x2 - ((g.getFontMetrics().stringWidth(text1)) / 2), y8);
// Affichage boule
int pixelsBall = (x15 + y15) / 2;
g.fillOval((x2 - (pixelsBall / 2)), (y2 + y3) / 2 + pixelsBall, pixelsBall, pixelsBall);
// Affichage rectangles
g.fillRect(x8, rectangle1, rectangleWidth, rectangleHeight);
g.fillRect((x - x8 - rectangleWidth), rectangle2, rectangleWidth, rectangleHeight);
Init_var();
}
@Override
public void actionPerformed(ActionEvent e) {
if (rectangle1 < y4 || rectangle1 > 3 * y4 || rectangle2 < y4 || rectangle2 > 3 * y4) { }
else {
rectangle1 += velY1;
rectangle2 += velY2;
repaint();
}
}
@Override
public void keyPressed(KeyEvent e) {
int c = e.getKeyCode();
if (c == KeyEvent.VK_UP) {
velY2 = -1;
}
if (c == KeyEvent.VK_DOWN) {
velY2 = 1;
}
if (c == KeyEvent.VK_Z) {
velY1 = -1;
}
if (c == KeyEvent.VK_S) {
velY1 = 1;
}
}
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void keyReleased(KeyEvent e) {
velY1 = 0;
velY2 = 0;
}
public static void main(String[] args) {
JFrame window = new JFrame("Pong Evolution");
window.setSize(800, 600);
window.setLocationRelativeTo(null);
window.setContentPane(new PongEvolution());
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
La méthode qui sert à initialiser les objets, c'est le constructeur. Donc la logique, ce serait plutôt d'appeler initVar (merci de respecter les conventions de nommage) à partir du constructeur. Du coup, plus besoin de booléen init.
JPanel et PaintComponent
× 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.