【最大10000ポイント】当たる!!質問投稿キャンペーン!

こんばんは。GUIで、一秒ごとに画像を切り替える、スライドショーのようなものを作ってみたのですが、画像が切り替わらず、画像の上に画像が配置され、どんどん積み重なっていく感じになりました。以下がそのコードです。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class IconChange extends JFrame{

private Timer timer;
private JLabel img;
private int sec;
private Icon[] icon=new ImageIcon[11];
private JPanel pane;

public static void main(String[] args){
IconChange frame=new IconChange("画像チェンジ");
frame.pack();
frame.setDefaultCloseOperation(3);
frame.setVisible(true);
}

public IconChange(String title){
super(title);
sec = 0;
pane=(JPanel)getContentPane();
pane.setPreferredSize(new Dimension(800,600));
pane.setOpaque(true);
pane.setBackground(new Color(0x00000000, true));

img=new JLabel(new ImageIcon("images2/1.jpg"));
pane.add(img);

for(int i=0;i<=10;i++){
icon[i]=new ImageIcon("images2/"+i+".png");
}
timer = new Timer(1000 , new Kirikae());
timer.start();
}

class Kirikae implements ActionListener{

public void actionPerformed(ActionEvent e){

img.setIcon(icon[sec]);
if(sec>=10){sec=0;}
sec++;
}
}
}

JLabelに画像をセットしたら、前の画像と入れ替わり新しい画像がセットされるとおもったのですが、前の画像が残ったまま新しい画像がセットされます。新しい画像をセットする前に前の画像のセットを取り消したいのですが、いい方法がございましたらアドバイスお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

手っ取り早いのは、


img.setIcon(icon[sec]);
の呼び出し後に、
IconChange.this.repaint();
を実行してフレーム内部を再描画する方法です。


あるいは、JLabelの代わりに次のようなMyLabelクラスを作成して
ラベル描画時に一度全体をクリアする方法もあります。

class MyLabel extends JLabel
{
public MyLabel(ImageIcon icon)
{
super(icon);
}

public void paint(Graphics g)
{
Rectangle r=this.getBounds();

g.clearRect(r.x,r.y,r.width,r.height);

super.paint(g);
}
}
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。おっしゃられた通りやりましたら、うまく動きました。

お礼日時:2008/07/24 12:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング