2017-10-16 19 views
0

Salut im essayant de faire un rectangle monter et descendre sur la touche dans jframe. mais le rectangle ne descend que lorsque j'appuie sur les flèches haut et bas et ne s'arrête pas. et je ne vois pas où j'ai fait une erreur.Faire un rectangle monter et descendre à la touche dans jframe

Je ne pense pas que l'erreur est dans le fichier un mais comme dit, je ne peux pas le trouver, il est peut-être.

fichier 1

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 

public class test{ 

    public static void main (String[] arg) { 
    JFrame window = new JFrame(); 
     test2 t2 = new test2(); 
     window.add(t2); 
     window.setSize(1000,1000); 
     window.setTitle("TEST"); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setVisible(true); 
    } 
} 

fichier 2

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 

public class test2 extends JPanel implements ActionListener, KeyListener{ 

    Timer t = new Timer(5, this); 
    double x = 0, y = 0, velx = 0, vely = 0; 

    public test2() { 
     t.start(); 
     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 
    } 



    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.fill(new Rectangle((int)x, (int)y, 20, 40)); 
    } 

    public void actionPerformed(ActionEvent e) { 
     repaint(); 
     x += velx; 
     y += vely; 
    } 

    public void up() { 
     vely = -1.5; 
     velx = 0; 
    } 

    public void down() { 
     vely = 1.5; 
     velx = 0; 
    } 

    public void keyPressed(KeyEvent e) { 
     int code = e.getKeyCode(); 

     if (code == KeyEvent.VK_UP); { 
      up(); 
     } 

     if (code == KeyEvent.VK_DOWN); { 
      down(); 
     } 
    } 

    public void keyTyped(KeyEvent e){} 
    public void keyReleased(KeyEvent e){} 
} 

Répondre

0

Votre logique est pas très optimale. Vous devez avoir votre code plus comme ceci:

/** DELETE THIS METHOD! 
public void actionPerformed(ActionEvent e) { 
    repaint(); 
    x += velx; 
    y += vely; 
}**/ 

private static final double MOVEMENT = 1.5; 

public void up() { 
    x += -MOVEMENT; // Mind the - in front of MOVEMENT to negate the value. 
    // No need to change y if it does not change at all 

    repaint() // Repaint _after_ you changed the coordinates 
} 

public void down() { 
    x += MOVEMENT; // Mind that there is no - infront of this MOVEMENT. 
    // No need to change y if it does not change at all 

    repaint() // Repaint _after_ you changed the coordinates 
} 

public void keyPressed(KeyEvent e) { 
    int code = e.getKeyCode(); 

    if (code == KeyEvent.VK_UP); { 
     up(); 
    } 

    if (code == KeyEvent.VK_DOWN); { 
     down(); 
    } 
} 
+0

Et juste comme une note de côté: Chose à propos de "serrage" X et Y pour éviter d'avoir des valeurs qui sont hors de votre zone visible. – Korashen

0

Vous manquez d'appeler repeindre() onyour JPanel après avoir changé la position de x, y;

Notez également que vos événements ne déclencheront que deux fois (OnKeyDown et OnKeyUp).