2017-10-16 8 views
0

안녕하세요, jframe에서 키를 누른 채 사각형을 위아래로 이동하려고합니다. 하지만 위쪽 또는 아래쪽 화살표 키를 누르면 사각형이 내려 가서 멈추지 않습니다. 나는 실수를 저지른 곳을 볼 수 없다.jframe의 키를 눌렀을 때 직사각형을 위아래로 움직입니다.

실수는 파일 하나에 있다고 생각하지 않지만 말했다시피, 나는 그것을 찾을 수 없습니다.

파일 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); 
    } 
} 

파일이

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){} 
} 

답변

0

당신의 논리는 매우 최적이 아니다. 당신은 더 같은 코드가 있어야합니다

당신은 x의 위치를 ​​변경 한 후 JPanel의 onYour) (칠 호출 그리워
/** 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

사이드 노트와 같이 : 보이는 영역에서 벗어난 값을 가지지 않도록 X와 Y를 "고정"하는 것. – Korashen

0

, Y;

또한 이벤트가 두 번 (OnKeyDown 및 OnKeyUp) 트리거됩니다.