// 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 } }
counterはprivate変数とし、getterメソッドによって値を取得できるようにする。
private int counter=0; // step5
/** return the number of updates */ public int getCounter() { return 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); }