みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaのrepaint()について

Java初心者です。

現在、アニメーションで少々つまずいています・・・ソースは以下の通りです。


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

public class test04 extends Frame implements KeyListener
{
public int x = 10, y = 10;
public static void main(String[] args)
{
new test04();
}

test04()
{
super("KeyFrameTest");//フレーム名
setSize(200, 200);//フレームサイズを設定

MyCanvas mc = new MyCanvas();
mc.addKeyListener(this);
add(mc);

setVisible(true);//フレームを表示
addWindowListener(new Close());//クローズ処理
}

/*** キーが押されているとき ***/
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();

switch(key)
{
case 37://←
x--;
break;
case 38://↑
y--;
break;
case 39://→
x++;
break;
case 40://↓
y++;
break;
}
System.out.println("(" + x + "," + y + ")");
}

/*** キーが離されたとき ***/
public void keyReleased(KeyEvent e)
{
}

/*** キーが押された瞬間 ***/
public void keyTyped(KeyEvent e)
{
}

/*** キャンバス用クラス ***/
class MyCanvas extends Canvas
{
/*** 描画ステータス ***/
public void paint(Graphics g)
{
g.setColor(Color.red);
g.fillRect(x, y, 20, 20);
repaint();
}

/*** ペイント処理 ***///勝手に点滅するのを回避するため
public void update(Graphics g)
{
paint(g);
}
}
}

/*** クローズクラス ***/
class Close extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}

/*** スリープクラス ***/
class Sleep extends Thread
{
public void Sleep(long milli)
{
try
{
Thread.sleep(milli);
}
catch(Exception e)
{
}
}
}



↑のプログラムを実行すると、押したキーに対応する動作はするのですが、
前に描画した残像が残ってしまい、上手くいきません・・・repaint()の位置を変えてみたり
したら、今度はボックスが動かなくなってしまい、訳が分からなくなって来ました・・・何故
上手くいかないんでしょうか?

理想的な動作としては、押したキーに対応した動作をし、残像も残らないようにしたいです。

ご回答よろしくお願いします。

投稿日時 - 2012-03-31 17:06:27

QNo.7394581

暇なときに回答ください

質問者が選んだベストアンサー

まずは、
1)レス1さんが書いたとおり、無限ループになってるのでMyCanvasのpaintメソッドからrepaint()を消す。
2)keyを押した時に、mcのrepaintがされてないので、以下のどちらかをする。
 a) mcをtest04のメンバー変数にして、mc.repaint()をkeyPressed(KeyEvent e)の最後に足す。
 b) mcを他の場所で必要なければ、↓を足す。
Component[] comps =getComponents();
for(Component comp:comps){
comp.repaint();
}

残像については、
MyCanvasのpaintメソッドの最初に
super.paint(g)

投稿日時 - 2012-04-03 14:47:56

お礼

無事に上手く行きました!
ありがとうございます。

投稿日時 - 2012-04-04 17:39:01

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

手元だと MyCanvas#paint で無限ループしてる (paint が repaint を呼ぶ→repaint から paint が呼ばれる→paint が repaint を呼ぶ→以下略) けどなぁ.

test04#keyPressed の中で MyCanvas#repaint を呼び出す.

投稿日時 - 2012-04-01 00:41:44

あなたにオススメの質問