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

解決済みの質問

落下する正方形を左右に移動するプログラム

Javaについての質問です。
正方形を250ミリ秒ごとに5ずつ落下させ、その正方形をボタンで左右に移動できるアップレットを作りたいのですが、
落下はするけど左右に移動しません。改善点が分からないのでアドバイスをお願いします。
また、正方形がアップレットの外に出ないようにし、正方形が下に来た後はボタンを押しても左右に移動しないようにしてください。
また、プログラムはスレッドを定義するものと実行するものの2つあります。

//スレッドを定義する
import java.awt.*;

class MovingRect extends Thread{
Component component;
volatile boolean runFlag = false; //制御用のフラグ
volatile int interval; //時間間隔
int x, y; //正方形の始点の位置

//コンストラクタ
MovingRect(Component c, int t, int x0, int y0){
runFlag = true;
component = c;
interval = t;
x = x0;
y = y0;
}

public void run(){

//このコンポーネントの境界を表す
Rectangle r1 = component.getBounds();

//正方形を5ずつ落下させる
//正方形が下に来たら、動きを止める
for(; y < r1.height - 20; y += 5){
component.repaint();
try{
Thread.sleep(interval);
}
catch(InterruptedException e){}
if(!runFlag)
break;
}
runFlag = false;
component.repaint();
}

public void drawFrame(Graphics g){
g.fillRect(x, y, 20, 20);
}

public void end(){
runFlag = false;
}
}

--------------------------------------------------------------------------
//スレッドを実行するアップレット
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class MovingRectApp extends Applet implements ActionListener{
MovingRect thread1 = null;
Button left, right;
int i = 60; //iは正方形の始点のx座標、初期値は60

public void init(){
left = new Button("left");
left.addActionListener(this);
add(left);

right = new Button("right");
right.addActionListener(this);
add(right);
}

public void actionPerformed(ActionEvent e){

//正方形が左端から出ないようにする
if(e.getSource() == left){
i = Math.max(i - 20, 0);
}

//正方形が右端から出ないようにする
else if(e.getSource() == right){
i = Math.min(i + 20, 200);
}
repaint();
}

public void paint(Graphics g){
if(thread1 != null)
thread1.drawFrame(g);
}

public void start(){
//時間間隔は250ミリ秒
thread1 = new MovingRect(this, 250, i, 40);
thread1.start();
}

public void stop(){
thread1.end();
thread1 = null;
}
}

投稿日時 - 2014-03-25 19:38:18

QNo.8528612

困ってます

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

コンストラクタで初期化した後にMovingRectクラスのxの値を変更するコードがどこにもないので、左右に動かないのは当然です。
MovingRectAppクラスのactionPerformed()でiの値を変化させていますが、iの値とxの値は連動しません。

投稿日時 - 2014-03-25 22:27:32

ANo.1

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

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

回答(1)

あなたにオススメの質問