2017-10-16 17 views
0

こんにちは、jframeでキーを押すと四角形を上下に移動しようとしています。 しかし、上向き矢印キーまたは下向き矢印キーを押すと長方形だけが下がり、停止しません。私はどこでミスをしたのかわからない。jframeのキー押下で矩形を上下に動かす

私は間違いがファイル1にあるとは思わないが、言われたように、私はそれが多分それを見つけることができない。

ファイル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); 
    } 
} 

ファイル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){} 
} 

答えて

0

あなたの論理は非常に最適化されていません。

/** 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

x、yの位置を変更した後に、あなたのJPanelを呼び出していない場合は、次のようにします。

また、イベントが2回(OnKeyDownとOnKeyUp)トリガーされることにも注意してください。

関連する問題