swingとスレッド

以下で、 ラベルを上→下→上と移動させるプログラムを示します。 ラベルには、画像と『ラベルです』のテキストをセットします。
セットする画像("ball00.gif")は、で、 ラベルの移動には、setBoundsメソッドを使っています。
変数yの位置を、繰り返しで変更し、それで位置変更していますが スレッドを使わないプログラムでは希望通りに動作しません。
正しくない理由は、単純にクリックイベントのactionPerformedの処理が終わらないと、 配置変更のsetBoundsなどの処理ができないためです。
そのためactionPerformed の処理をすぐ終わらせる必要があります。 つまり、移動の処理のスレッドを起動するだけして、すぐ終わらせれば可能となります。
チェックボックスで、スレッドを使うプログラムに変更した動作も行わせて比較ください。 (スレッドを使わない場合のスタートボタンによる移動結果を見るのに10数秒が必要です)

package test;//JFrame作品
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ThreadTest extends JApplet implements ActionListener ,Runnable
{
	JPanel panel;//部品配置用のパネル
	JButton button = new JButton("スタート");
	JLabel label = new JLabel("ラベルです");
	int y = 100;//ラベルのy位置
	int dy = 5;//ラベルy方向移動量

	ThreadTest() throws Exception {//コンストラクタ
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//閉じるボタンで終了
		this.panel = new JPanel();
		this.setContentPane(this.panel);//フレーム内のルートパネルとして指定
		this.panel.setPreferredSize(new Dimension(400, 300));
		this.panel.setLayout(null);//レイアウトなし(位置指定)
		java.net.URL imgURL = ThreadTest2.class.getResource("ball00.gif");
		this.label.setIcon(new ImageIcon(imgURL));//ラベルに画像セット
		javax.swing.border.Border border = new javax.swing.border.LineBorder(Color.BLUE, 2);
		this.label.setBorder(border);//ラベルに上記の枠をセット
		this.panel.add(this.button);
		this.panel.add(this.label);
		this.button.setBounds(200, 50, 100, 30);//座標(200,50)の位置に幅:100,高さ:30で配置
		this.label.setBounds(0, y, 200, 80);//座標(0,y)と幅:200,高さ:80で配置
		this.setBounds(0, 0, 500, 300);//サイズ指定
		this.setVisible(true);	
		this.button.addActionListener(this);
	}
	public void actionPerformed(ActionEvent e){//スレッドを利用する
		this.button.setEnabled(false);//クリック後、ボタンを使えなくする
		Thread thred = new Thread(this);
		thred.start();
	}
	public void run(){
		for (;;){
			label.setBounds(0, y, 200, 80);//座標(0,y)と幅:200,高さ:80で配置
			y += dy;
			if (y > 300) dy = -dy;//移動方向を変更
			else if (y < 0) break;
			try	{
				Thread.sleep(); //引数のミリ秒間だけ停止して、他のスレッドを実行
			}
			catch (Exception err){
				err.printStackTrace();
			}
		}
	}
	public static void main(String[] arg) throws Exception
	{
		new ThreadTest();
	}
}

上記を確認後、このボタンをクリックください。→