26.1.9.26 スレッドとボタン

import java.awt.*;
import java.applet.Applet;
import java.awt.event.*; 
public class Pulsing2 extends Applet
                     implements Runnable,ActionListener{
  Button running = new Button("stop");
  int cx, cy, r=10, dr=2;
  public void init(){
     add(running);
     running.addActionListener(this);
     cx = getSize().width/2;
     cy = getSize().height/2;
  }
  Thread th = null;
  public void start(){
     if(th==null){th = new Thread(this); th.start();} }
  public void stop(){
     if(th!=null){th.stop(); th = null; } }
  public void run(){
     while(true){                    // 無限ループ
         if(r > cy || r < 10) dr = -dr;
         r = r+dr;
         repaint();
         try{ th.sleep(100); }       // 100ミリ秒の時間待ち
         catch(InterruptedException e){ }
     }
  }
  public void actionPerformed(ActionEvent e){
     if((running.getLabel()).equals("stop")){
        th.suspend();               // 一時停止
        running.setLabel("run");
     }else{
        th.resume();                // 実行再開
        running.setLabel("stop");
     }
  }
  public void paint(Graphics g){
     g.drawOval(cx-r, cy-r, 2*r, 2*r);
  }
}

filePulsing2.java (iso-2022-jp)

ボタン"running"の表面に文字列"run"か"stop"かを表示しておき,その文字列をrunning.getLabel()で取得して動作を選択しています.getLabelの反対はsetLabelです.

"suspend"と"resume"は,スレッドを一時停止したり再開したりします.この制御を受けるのはスレッドthです.