2016-04-10 19 views
-1

アプレット内の画像(ここでは長方形です)を移動したいが、アプレットがそれを描画しますが、なぜ画像が動いていないのでしょうか?コンパイルエラーはありません!私は私のアップ/ダウン/左/書き込み矢印を押す画像がアプレット内を移動していません

package game; 

import java.awt.*; 
import javax.swing.*; 
import java.applet.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 



public class Gamer extends JApplet implements KeyListener 
{ 
    private int x=50,y=50; 


@Override 
public void init() 
{ 
    addKeyListener(this); 
} 

@Override 
public void keyPressed(KeyEvent e) 
{ 
    int keyCode = e.getKeyCode(); 

    switch(keyCode) 
    { 
    case KeyEvent.VK_UP: 
     if(y>0) //when up key is pressed and the position of the player is not on the edge 
     { 
      y=y-19; 
      repaint(); 
     } 
     break; 
    case KeyEvent.VK_DOWN: 
     if(y<171) //when down key is pressed and the position of the player is not on the edge 
     { 
      y=y+19; 
      repaint(); 
     } 
     break; 
    case KeyEvent.VK_LEFT: 
     if(x>0) 
     { 
      x=x-15; 
      repaint(); 
     } 
     break; 
    case KeyEvent.VK_RIGHT: 
     if(x<285) 
     { 
      x=x+15; 
      repaint(); 
     } 
     break; 
    } 
} 
@Override 
public void paint(Graphics g) //will draw the background and the character 
{ 
    g.fillRect(x, y, 200, 200); 

} 

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

} 

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

} 
} 

、長方形が動いていない。

は、ここに私のコードです。 理由を説明してください。 T.I.A.

+0

1)なぜアプレットをコーディングするのですか?教師がそれを指定している場合は、[CS教師が** Javaアプレットを教えるのを止めるべき理由](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-java-applets /)を使用します。 2)[Java Plugin support deprecated](http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/)および[Plugin-Free Webへの移動]を参照してください( https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free)。 3)Swingでは、通常、KeyListenerではなく[key bindings](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)を使用します。 –

答えて

1

問題は、アプレットがKeyEventをキャッチしないため、ペイントメソッドが呼び出されないということです。

実際には、KeyListenerJAppletに追加するときに問題が発生し、機能しません。

解決策は、KeyListenerの代わりにKeyEventDispatcherを実装することです。これは参考になる

package game; 

import java.awt.Graphics; 
import java.awt.KeyEventDispatcher; 
import java.awt.KeyboardFocusManager; 
import java.awt.event.KeyEvent; 

import javax.swing.JApplet; 

public class Gamer extends JApplet implements KeyEventDispatcher { 
    private int x = 50, y = 50; 

    @Override 
    public void init() { 
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); 
    } 

    @Override 
    public void paint(Graphics g) // will draw the background and the character 
    { 
     super.paint(g); // <- added to your code to clear the background 
         //   before re-painting the new square 

     g.fillRect(x, y, 20, 20); 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 

     switch(keyCode) 
     { 
     case KeyEvent.VK_UP: 
      if(y>0) //when up key is pressed and the position of the player is not on the edge 
      { 
       y=y-19; 
       repaint(); 
      } 
      break; 
     case KeyEvent.VK_DOWN: 
      if(y<171) //when down key is pressed and the position of the player is not on the edge 
      { 
       y=y+19; 
       repaint(); 
      } 
      break; 
     case KeyEvent.VK_LEFT: 
      if(x>0) 
      { 
       x=x-15; 
       repaint(); 
      } 
      break; 
     case KeyEvent.VK_RIGHT: 
      if(x<285) 
      { 
       x=x+15; 
       repaint(); 
      } 
      break; 
     } 
     return false; 
    } 

} 

希望:また、私はより良い長方形の動きを見ることができるようにするために、20から200からあなたの四角形のサイズを変更しました。

+0

それは、ありがとう、多くの作品 – 000

+0

あなたの歓迎。いいえ、 'KeyEventDispatcher'を' init() 'メソッドに登録することは必須ではありません。これはアプレットなので、 'init'にすべてのコンポーネントを初期化しています。あなたの例では、' KeyEventDispatcher'を登録するための他の適切なメソッドはありませんでした。何とかこのサンプルでは必須です;-) – STaefi

関連する問題