2011-12-27 10 views
-3

私は、サークルを作成してキーリスナーを追加して動作させることでグラフィックプログラムをテストしようとしています。KeyListenerが動作しません

しかし、私はそれが動作しないことを見た!しかしグラフィックはうまく機能します!

私のためにコードを修正できますか?あなたのコードの

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

import javax.swing.*; //AWT extends 

public class dotMoveByArrow extends JPanel implements ActionListener, KeyListener { 

    Timer t = new Timer(5, (ActionListener) this); 
    double x = 0, y = 0, velX = 2, velY= 2; 

    public void dotMoveByArrow() { 

     t.start(); 
     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 
     setVisible(true); 
    } 

    public void paintComponent(Graphics g) { 

     super.paintComponents(g); 
     Graphics2D g2 = (Graphics2D) g; 
     Ellipse2D circle = new Ellipse2D.Double(x, y, 40, 40); 
     g2.fill(circle); 
    } 

    public void actionPerformed(ActionEvent event) { 

     repaint(); 
     x += velX; 
     y += velY; 
    } 

    public void up() { 

     velY = -1.5; 
     velX = 0; 
    } 

    public void down() { 

     velY = 1.5; 
     velX = 0; 
    } 

    public void left() { 

     velX = -1.5; 
     velY = 0; 
    } 

    public void right() { 

     velX = 1.5; 
     velY = 0; 
    } 

    public void keyPressed(KeyEvent event) { 

     int key = event.getKeyCode(); 
     if (key == KeyEvent.VK_UP) { 

      up(); 
      System.out.println("up"); 
     } 

     if (key == KeyEvent.VK_DOWN) { 

      down(); 
      System.out.println("down"); 
     } 

     if (key == KeyEvent.VK_LEFT) { 

      left(); 
      System.out.println("left"); 
     } 

     if (key == KeyEvent.VK_RIGHT) { 

      right(); 
      System.out.println("right"); 
     } 
    } 

    public void keyReleased(KeyEvent arg0) {} 

    public void keyTyped(KeyEvent arg0) {} 

    public static void main(String[] args) { 

     dotMoveByArrow d = new dotMoveByArrow(); 
     JFrame f = new JFrame(); 

     f.getContentPane().add(d); 
     f.setBackground(new Color(255, 255, 255)); 
     f.setUndecorated(true); 
     f.setVisible(true); 
     f.setSize(640, 480); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setTitle("Dot Move by Arrow"); 
    } 
} 
+4

について: "さて、あなたは私のコードを修正できますか?" - あなたが私たちの提案に従って、あなた自身のコードを修正するなら、あなたにとってははるかに優れています*。私はあなたがGoogleとキーバインディングを使用することをお勧めします。これはKeyListenerではありません。まともなチュートリアルがあります。これについて簡単に見つけることができます。また、このようなフォーラム(いくつか私が書いたいくつかの例)で多くの例が見つかります。運。 **編集:**チュートリアルのリンク:[キーバインディングの使い方](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) –

答えて

3

1つの問題は、あなたが多分

public dotMoveByArrow() { ... } 

(には voidが存在しないことに注意コンストラクタであると考えられていた方法

public void dotMoveByArrow() { ... } 

が定義されていることです宣言)。

メソッドはコード内で呼び出されないため、リスナーはまったく登録されていません。

+0

ありがとう!それは働いている! –

+0

@GrimReaperようこそStackOverflowへ!あなたが最もよく答えている答えの横にあるチェックマークをクリックしてください。これは、正解を提供した人にはクレジットを与え、他のユーザーに質問には有効な解決策があることを伝えます。ありがとう! :) – fireshadow52

3

dotMoveByArrowメソッドは呼び出されないため、リスナーは追加されません。 dotMoveByArraowがコンストラクタことになっている場合、それはvoid戻り値の型なし

public dotMoveByArrow() 

として宣言する必要があります。慣習的に、Javaクラスは常に大文字で始まります。したがって、コンストラクタも大文字で始まります。

関連する問題