2016-04-18 9 views
3

今日は私の心が揺れる問題です。私は、ユーザがスペースを押すたびに動く赤い矩形を描こうとしています。問題は、私がスペースを押すたびに矩形が動かないことです。なぜ、どのように私はこの問題を解決できる任意のアイデアですか?JAVAのKeyBoard入力でアニメーションを実行するにはどうすればよいですか?

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.*; 

public class Animation extends JPanel implements ActionListener, KeyListener{ 

    int x = 0, y = 0, velx=0; 

    public Animation(){ 
     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 
    } 

    public static void main(String args[]){ 
     JFrame frame = new JFrame("Animation Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setSize(500, 500); 
     Animation a = new Animation(); 
     frame.add(a); 

    } 

    public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, 500, 500); 
     g.setColor(Color.RED); 
     g.fillRect(x, 50, 30, 20); 
     } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     x = x + velx; 
     repaint(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     // TODO Auto-generated method stub 
     int keyCode = e.getKeyCode(); 
     if(keyCode == e.VK_SPACE){ 
      velx = 2; 
     } 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

} 
+0

なぜあなたはAWTをインポートしなかったし、スイング?どちらか一方を使用してください。また、質問に「awt」タグと「swing」タグを追加すると、フィードバックが増えるかもしれません:) –

+0

基本的には、以下の答えで 'actionPerformed'が呼び出されることはまずありません。 'KeyListener'イベントに更新ロジックを置く必要があります。 – Gorbles

+0

[キーバインディングの使用方法](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

答えて

1

コードに以下の変更を加えました。スペースを押すと、矩形が移動するはずです。

  1. JFrameにKeyListenerを追加します。
  2. KeyBoardイベントリスナーメソッドの変更。

CODE:

public class Animation extends JPanel implements ActionListener, KeyListener{ 

int x = 0, y = 0, velx=0; 

public Animation(){ 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 
} 

public static void main(String args[]){ 
    JFrame frame = new JFrame("Animation Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setSize(500, 500); 
    Animation a = new Animation(); 
    frame.add(a); 
    frame.repaint(); 
    frame.addKeyListener(a); 

} 

protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, 500, 500); 
    g.setColor(Color.RED); 
    g.fillRect(x, 50, 30, 20); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    x = x + velx; 
} 

@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 
    int keyCode = e.getKeyCode(); 
    if(keyCode == e.VK_SPACE){ 
     velx = 2; 
     x = x + velx; 
    } 
    repaint(); 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 

} 
+0

[キーバインディングの使用方法](http://docs.oracle.com/ javase/tutorial/uiswing/misc/keybinding.html)および[初期スレッド](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)を参照してください。 'paintComponent'をパブリックにする必要はありません。 – MadProgrammer

+0

@MadProgrammer Edited。それを指摘してくれてありがとう。 – alphablue

3

問題がKeyListenerです...コードでただ痛みです。

登録されているコンポーネントがフォーカス可能で、キーボードフォーカスがある場合にのみ、キーイベントに応答します。問題は、焦点の変更であり、管理と制御には苦労します。

代わりに、あなたはこの問題を解決するために設計されたKey Bindings APIを使用する必要があります

、多分thisのようなものが役立つかもしれないSO上のキーバインディングのたくさんの例があります

関連する問題