キー移動  参考ページ

キーで移動するために、KeyListener をインプレメントします。
なお、動作してから、アプレットをクリックして、フォーカスを移動してから←↑↓→キーで動作を確信ください。 (この色)が変更箇所です。)

package fishgame;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.imageio.*;
import javax.swing.*;
import sprite.SpriteBasic;//ライブラリ利用
import sprite.SpriteFrame;
import sprite.SpriteThread;

class SpriteFishA extends SpriteBasic {//右から左に移動するクラス
	double speed_x; // 移動速度(1回のactionで変更する横移動量)

	SpriteFishA(Image img,int px, int py, int speed){//コンストラクタ
		super(img);
		this.x = px;//初期位置
		this.y = py;
		this.speed_x = speed; //速度
	}
	public void action(){//移動処理(SpriteThreadのanimationIntervalミリ秒ごとに実行される)
		super.action();//スーパクラス:SpriteBasicのactionを実行

		this.x += this.speed_x;//移動
		if(this.x < -100) {//左に隠れたか?
			this.x = 680;	//右の見えない所に出現させる。
			this.y = rand.nextInt(450)+30;;//出現させるY座標は乱数を使う
			this.speed_x = -( rand.nextInt(8)+4 );//速度も乱数
		}
	}
}
class SpriteMover extends SpriteBasic //上下左右に移動するクラス
{
	double speed_x; // 移動速度(1回のactionで変更する横変化量)
	double speed_y; // 移動速度(1回のactionで変更する横変化量)
	SpriteMover(Image img,int px, int py){//コンストラクタ
		super(img);
		this.x = px;//初期位置
		this.y = py;
		this.speed_x = 0; //速度 x方向
		this.speed_y = 0; //速度 y方向
	}
	public void action(){//移動処理
		super.action();//スーパクラス:SpriteBasicのactionを実行

		this.x += this.speed_x;//横に移動
		this.y += this.speed_y;//縦に移動
		if(this.x < 0 || this.x + 100 > 640) this.speed_x = 0;
		if(this.y < 0 || this.y + 100 > 480) this.speed_y = 0;
	}
}
public class TestSplitePanel1 extends JPanel implements KeyListener {

	static Image bg;//背景素材イメージ
	static Image ch;//素材1イメージ
	static Image ch2;//素材2イメージ
	static {
		try{
			bg = ImageIO.read(TestSplitePanel1.class.getResource("aqua00.jpg"));//背景素材イメージ
			ch = ImageIO.read(TestSplitePanel1.class.getResource("sanma00.gif"));//素材1イメージ
			ch2 = ImageIO.read(TestSplitePanel1.class.getResource("jellyfish.gif"));//素材2イメージ
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}

	SpriteThread spriteThread;	// 描画、アニメーションスレッド
	SpriteBasic back = new SpriteBasic(bg);
	SpriteMover jellyfish = new SpriteMover(ch2, 200, 100);

	public TestSplitePanel1() throws Exception {
		int w = bg.getWidth(this);//背景画像サイズ取得
		int h = bg.getHeight(this);
		this.setPreferredSize(new Dimension(w,h));
		spriteThread = new SpriteThread(w, h, this);

		spriteThread.add( back );//背景を追加
		for(int n=0; n < 5; n++){
			spriteThread.add( new SpriteFishA(ch,  -100, 100, -1));//魚追加
		}
		spriteThread.add( jellyfish );//魚追加

		spriteThread.start(10);//0.01秒のアクションスレッド スタート

		this.addKeyListener(this);

		this.setFocusable(true);//JPanelのデフォルトを変更して、キーボードイベントを可能しなければなりません。
		this.requestFocus(); //初期フォーカスを、このパネルにする。
	}
	public void paintComponent(Graphics g){//間隔(0.01秒)で呼び出される。
		super.paintComponent(g);
		if (spriteThread != null) spriteThread.paintTo(g);
	}
	public static void main(String[] arg) throws Exception{
		new SpriteFrame(new TestSplitePanel1());//フレーム作品実行
	}

	@Override
	public void keyTyped(KeyEvent e) {
		char c = e.getKeyChar();
		System.out.println("Typed:" + c + "\n");
	}
	@Override
	public void keyPressed(KeyEvent e) {
		int keyCode = e.getKeyCode();
		System.out.println(jellyfish.x + ", " + jellyfish.y + ":Pressed:" + keyCode + "\n");
		if(keyCode == KeyEvent.VK_LEFT)  jellyfish.speed_x -= 1;
		if(keyCode == KeyEvent.VK_RIGHT) jellyfish.speed_x += 1;
		if(keyCode == KeyEvent.VK_UP)    jellyfish.speed_y -= 1;
		if(keyCode == KeyEvent.VK_DOWN)  jellyfish.speed_y += 1;
	}
	@Override
	public void keyReleased(KeyEvent e) {
		int keyCode = e.getKeyCode();
		System.out.println("Released:" + keyCode + "," + KeyEvent.VK_C + "\n");
	}
}

パネルにフォーカス(キー入力)を持たせるためにはsetFocusableの設定が必要です。
クラゲの画像Spriteであるjellyfish変数を介してしてをキーボードで移動できます。

なお、KeyListenerを使わず、パネルのprocessKeyEventメソッドをオーバーライドする方法もあります。
	@Override
	public void processKeyEvent(KeyEvent e) {
		if (e.getID() == KeyEvent.KEY_PRESSED){
	    	int keyCode = e.getKeyCode();
	    	System.out.println(jellyfish.x + ", " + jellyfish.y + ":Pressed:" + keyCode + "\n");
	    	if (keyCode == KeyEvent.VK_LEFT) jellyfish.speed_x -= 1;
	    	if(keyCode == KeyEvent.VK_RIGHT) jellyfish.speed_x += 1;
	    	if(keyCode == KeyEvent.VK_UP)    jellyfish.speed_y -= 1;
		    if(keyCode == KeyEvent.VK_DOWN)  jellyfish.speed_y += 1;
		} else if (e.getID() == KeyEvent.KEY_RELEASED){

		}
	}
さて、キーイベントの状態を表示するテキストエリアを配置して テキストエリアをクリックなどして、入力状態にすると、操作ができなくなります。
それは、パネルのイベントにキーイベントが送られないからです。
そこでCのボタンを押した時にパネルへフォーカスを移動するコードを追加するTextArrea継承クラスの紹介です。
	class MyTextArea extends JTextArea implements KeyListener{//専用テキスト用内部クラス----
		MyTextArea(int rows, int columns)//コンストラクタ{
			super(rows,columns);
			this.addKeyListener(this);
		}
		public void keyPressed(KeyEvent e){//キーを押しているときに呼び出されます。
				MainPanel.this.processKeyEvent(e);//イベントをパネルへ送る dispatchEvent
		}
		public void keyReleased(KeyEvent e){//キーを離したときに呼び出されます。 
			MainPanel.this.keyPressed(e);
			int keyCode = e.getKeyCode();
			this.append("TextArea のReleased:" + keyCode + "\n");
			if (keyCode == KeyEvent.VK_C)
				MainPanel.this.requestFocus(); //Cのキーが押されたら、このフォーカスをパネルにする。
		}
		public void keyTyped(KeyEvent e){//キーをタイプすると呼び出されます。
		}
	}