GUI tutorial for numerical simulation (5)

「ストップ」、「再開」ボタンを活かす

GUI

	// step 5
        restartBtn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    /**
                     * 中断したスレッドを再開
                     */
		    /** step5: set the parameters and restart XXX ***/
		    int a = slider_1.getValue();
		    double b = (double) slider_2.getValue()/scale_2;
		    XXX.setParameters(a,b);  // パラメータは新しい値にし
                    thread_start();          // 再スタート
                }
            });
	stopBtn.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent ae) {
		    stop();
		}
	    });
    public void stop() { /** stopボタンで呼び出す */
        halt_ = true;
        myTh.interrupt();
    }

    /** 新しいスレッドの実体 */
    public void run() {
	while(!halt_) {    // step5: stop()によりhalt_がtrueになるので終了
	    XXX.updateSystem();
	    simulationFrame.drawCircles(XXX); // arg. is the simulation model object
	}
    }

XXXmodel内にupdate数のカウンタをつける

counterはprivate変数とし、getterメソッドによって値を取得できるようにする。

    private int counter=0;   // step5
    /** return the number of updates */
    public int getCounter() {
	return counter;
    }

drawFigureに、時刻(counter)を表示するようにしてみる

startとrestartの違いを確認するために、文字列を下欄に表示するメソッドを作成し、描画のメソッドから呼び出す。

    public void drawCircles(XXXmodel XXX) { // step4: arg. is the simulation model

	// 画面を白で塗りつぶす
    	g.setColor(new Color(255,255,255));
    	g.fillRect(0, this.marginY, gWin.getWidth(),gWin.getHeight());

	// 適当に丸を書く
    	for(int n = 0; n< XXX.N ;n++){
	    double centerX = XXX.x[n];
	    double centerY = XXX.y[n];
	    this.g.setColor(new Color(255,0,0)); // 色の指定
	    double nX =  screenWidth * centerX +this.frameLeft+this.marginX;
	    double nY =  screenWidth * centerY +this.frameTop + this.marginY;
	    this.g.fillOval((int) nX, (int) nY, 30, 30);
	}

	this.showString("time=" + XXX.getCounter());  // step 5: show time

	// 1秒休む
	try{
	    Thread.sleep(1000);
	}catch (InterruptedException e){
	}
    }

    /*** 下欄に文字列を表示 */
    public void showString(String str) {
	/** set the property of strings to show status (本格的に使うのならどこかに移す */
    	Font font = new Font("Arial", Font.BOLD, 24); // フォントはOS等に依存する
    	this.g.setFont(font);
    	int showStringHeight=30;
	g.setColor(new Color(255,255,255));
    	g.fillRect(0, gWin.getHeight() - showStringHeight,gWin.getWidth(), showStringHeight);
	g.setColor(new Color(255,0,0));
    	g.drawString(str, 10,gWin.getHeight()-5);
    }