2016-05-20 1 views
0

"i、j、k、l"キーを押したとき(矢印キー)に動かすことができます。もう一度動かしてからアニメーションが見やすくなるまで待つためにタイマーを作成しようとしましたが、私は 'while(!quit)'ループを作成して以来、グラフィックスは移動も表示もしません。私のエラーを教えてください。グラフィックスをキーイベントに移動させる

コード:

import java.awt.*; 
import java.awt.Color.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.util.Timer; 
import java.util.TimerTask; 


public class Event_test{ 
    public static void main(String args[]) 
    { 
     boolean quit = false; 

     JFrame Window = new JFrame("Event_test"); 
     MyCanvas WCanvas = new MyCanvas(); 
     KeyCatcher k = new KeyCatcher(); 

     WCanvas.addKeyListener(k); 


     Window.getContentPane().add(WCanvas); 
     Window.setSize(640, 360); 
     Window.setVisible(true); 
     Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     new Notification(1); 

     while(!quit) 
     { 
      WCanvas.update(WCanvas.getGraphics()); 

      if(!Notification.flag) 
      { 
       continue; 
      } 
      else 
      { 
       Notification.flag = false; 
       System.out.println("tic"); 
       /* 
       CONTROLS: 
       */ 

       if(KeyCatcher.KEYS[0]) 
       { 
        MyCanvas.x--; 
       } 
       if(KeyCatcher.KEYS[1]) 
       { 
        MyCanvas.y++; 
       } 
       if(KeyCatcher.KEYS[2]) 
       { 
        MyCanvas.x++; 
       } 
       if(KeyCatcher.KEYS[3]) 
       { 
        MyCanvas.y--; 
       } 
       if(KeyCatcher.KEYS[4]) 
       { 
        quit = true; 
       } 

       new Notification(1); 
      } 


     } 
    } 
} 

class MyCanvas extends Canvas 
{ 
    static int x, y; 

    public void paint(Graphics g) 
    { 
     g = this.getGraphics(); 
     MyClass.drawSomething(g, x, y); 
    } 
} 

class MyClass 
{ 

    public static void drawSomething(Graphics g, int x, int y) 
    { 
     g.setColor(Color.RED); 
     g.drawOval(x, y, 10, 10); 
    } 
} 

class KeyCatcher implements KeyListener 
{ 

    static boolean KEYS[] = new boolean[5]; 


    public void keyPressed(KeyEvent e) 
    { 
     if(e.getKeyChar() == 'j'/*IZQ*/) 
     { 
      KEYS[0] = true; 
     } 

     if(e.getKeyChar() == 'i'/*ARR*/) 
     { 
      KEYS[1] = true; 
     } 

     if(e.getKeyChar() == 'l'/*DER*/) 
     { 
      KEYS[2] = true; 
     } 

     if(e.getKeyChar() == 'k'/*ABA*/) 
     { 
      KEYS[3] = true; 
     } 

     if(e.getKeyChar() == 'q'/*QUIT*/) 
     { 
      KEYS[4] = true; 
     } 
    } 

    public void keyReleased(KeyEvent e) 
    { 
     if(e.getKeyChar() == 'j'/*IZQ*/) 
     { 
      KEYS[0] = false; 
     } 

     if(e.getKeyChar() == 'i'/*ARR*/) 
     { 
      KEYS[1] = false; 
     } 

     if(e.getKeyChar() == 'l'/*DER*/) 
     { 
      KEYS[2] = false; 
     } 

     if(e.getKeyChar() == 'k'/*ABA*/) 
     { 
      KEYS[3] = false; 
     } 

     if(e.getKeyChar() == 'q'/*QUIT*/) 
     { 
      KEYS[4] = false; 
     } 
    } 

    public void keyTyped(KeyEvent e){ 

    } 
} 

class Notification{ 
    static boolean flag = false; 
    Timer timer; 

    Notification(int seconds) 
    { 
     timer = new Timer(); 
     timer.schedule(new Task(), seconds*1000); 
    } 

    class Task extends TimerTask 
    { 
     public void run() 
     { 
      //What task does: 
      flag = true; 
      timer.cancel(); 
     } 
    } 

} 
+0

whileループはすべてのCPUを食べそうです。最後に 'Thread.sleep(16)'を入れてみてください。それでも問題が解決しない場合は、実行中にプログラムが応答しますか? – Ironcache

+0

whileループを使用しないでください - Camickrの答えに従って、Swing Timerを使用してください。 –

答えて

5

あなたの質問はそうスイング(ないAWT)についてです:

  1. キャンバスを拡張しないでください。代わりにJPanelを拡張してカスタムペインティングを行います。
  2. 塗料(...)をオーバーライドしないでください。カスタムペイントは、paintComponent(...)オーバーレイによって行われます。
  3. TimerTaskは使用しないでください。代わりにスイングタイマーを使用してください。
  4. getGraphics()メソッドを使用しないでください。ポイント2を参照してください。
  5. 更新(...)を呼び出さないでください。コンポーネント上でrepaint()を呼び出すだけで、iselfがペイントされます。
  6. whileループは使用しないでください。これがSwing Timerを使用する理由です。
  7. 変数名を大文字で開始しないでください。 Javaの命名規則に従ってください。
  8. KeyListenerを使用しないでください。 SwingはKey Bindingsで使用するように設計されています。

基本的な絵の例については、Custom PaintingのSwingチュートリアルをご覧ください。

チェックアウトMotion Using the KeyboardKeyboard Animationの例は、これらの問題の多くに対応しています。

+0

返事が遅れて申し訳ありません。あなたの答えはありがとうございました、あなたが提供した最後のリンクが本当に私を助けてくれます。 –

関連する問題