画像がうまく表示されない。
アプレットを作っています。
左クリックすると、次の画像へ進む、といった処理を実装したのですが、1回は次の画像へ進むのですが、2回目以降が進みません(しかも、「1.jpg」から「2.jpg」へ進めたいのですが、何故か「1.jpg」から「10.jpg」にいってしまいます。)以下が現在のコードです。
余分な部分は削除しました。よろしくお願いします。
public class Main extends Applet implements MouseListener, Runnable{
Image nowImage, nextImage;
static int i;
MediaTracker mt = new MediaTracker(this);
MediaTracker mt2 = new MediaTracker(this);
int yousosu,w,h;
Thread thread;
static float alpha;
static boolean runflag = true;
static boolean flag = true;
static int j = 1;
Image buf;
Graphics ct;
int sleeptime = 300;
Image img;
Vector imgs = new Vector();
public void init(){
i = 0;
thread = new Thread(this);
yousosu = Integer.parseInt(getParameter("NumImage"));//配列(画像)の要素数
for(int t = 0; t < yousosu; t++){
img = getImage(getDocumentBase(),"imagesyukusyo/" + t+1 + ".JPG");
imgs.addElement(img);
img = null;
}
int kazu = imgs.size();
addMouseListener(this);
w = getSize().width;
h = getSize().height;
buf = createImage(w,h);//バッファ取得
//*******最初の画像のロード*******
nowImage = getImage(getDocumentBase(), "imagesyukusyo/1.JPG");//←Vectorの[0]要素?
}
public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){//drawImageファイルを表示するだけ
ct = buf.getGraphics();
Graphics2D ct2 = (Graphics2D) ct;
Graphics2D g2 = (Graphics2D) g;//Grahics2Dクラス
AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
mt.addImage(nowImage,0);
mt2.addImage(nextImage, 0);
try {
mt.waitForID(0);
mt2.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
ct2.drawImage(nowImage,0,0,w,h,this);
ct2.setComposite(composite);
//次からはcompositeを設定した後の描画になる。
ct2.drawImage(nextImage,0,0,w,h,this);
g2.drawImage(buf,0,0,w,h,this);
}
//*********マウスイベント************
public void mouseClicked(MouseEvent e) {
int btn = e.getButton();
//*******左クリック**********
if(btn == MouseEvent.BUTTON1){//左クリック=進め
System.out.println("左クリック");
System.out.println("iは"+i);
System.out.println("elementAtの数は"+imgs.size());
if(i >= yousosu){//要素数より多くなったら…
i = 0;
}
nowImage = (Image)imgs.elementAt(i);
if(i == yousosu-1){
nextImage = (Image) imgs.elementAt(0);
}else{
//通常こっち
nextImage = (Image) imgs.elementAt(i+1);
}
thread = new Thread(this);
thread.start();
thread = null;
i++;
}
}
public void run(){
alpha = 0.2f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 0.3f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 0.4f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 0.5f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 0.6f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 0.7f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 0.8f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 0.9f;
repaint();
try {
thread.sleep(sleeptime);
} catch (InterruptedException e) {
e.printStackTrace();
}
alpha = 1f;
repaint();
}
}
お礼
volatileをつけて確認しましたが駄目でした。その後の調査の結果、repaintの途中?のRMI通信部分でエラーとなってpaint処理が実行されていないことがわかりました。いろいろとご回答頂き、ありがとうございました。