JavaFXでストップウォッチを、TimeAPIとDurationクラスを使う事にこだわって作成しようとしています。
なんとかここまで作って来たのですが、ストップボタンを押したときの動作がうまく行きません。
timeline.stop()の使い方に誤りがあるようだと考えて、stopSWメゾット内にtimeline.stop()を記述したり、if文を用いたり色々手を尽くしてみましたがどうにもうまくいきません、それで質問させて頂くことにしました。どのようにすればtimeline.stop()を動作させる事が出来るのでしょうか?
Java
1package miyastopwatch9; 2 3import java.awt.Insets; 4import java.time.*; 5import java.time.format.DateTimeFormatter; 6import javafx.animation.KeyFrame; 7import javafx.animation.Timeline; 8import javafx.application.Application; 9import javafx.event.ActionEvent; 10import javafx.event.EventHandler; 11import javafx.animation.KeyFrame; 12import javafx.animation.Timeline; 13import javafx.geometry.Pos; 14import javafx.scene.Scene; 15import javafx.scene.control.Button; 16import javafx.scene.control.Label; 17import javafx.scene.layout.VBox; 18import javafx.scene.layout.HBox; 19import javafx.scene.text.Font; 20import javafx.stage.Stage; 21 22/** 23 * 24 * @author miya 25 */ 26public class MiyaStopwatch9 extends Application { 27 28 //フィールドの類 29 30 //時間計算用のInstant型が2つ 31 Instant timeA; 32 Instant timeB; 33 34 //結果のデータ出力用にInstant型とDuration型それぞれ1つ 35 Instant ans; 36 Duration durationans; 37 38 //ストップウオッチの制御用にboolean型を1つ 39 boolean stopSW=false; 40 41 //GUIの表示用にString型を1つ 42 String display; 43 44 /*Stringへの型変換用のフォーマット用変数を宣言、 45 フォーマッタの準備、変数formatter1にフォーマッタの代入をしている。*/ 46 DateTimeFormatter formatter1=DateTimeFormatter.ofPattern("H:mm:ss"); 47 48 //続いてGUIの類です。 49 Label labelTime1=new Label("00"); 50 LocalTime now=LocalTime.of(0, 0, 0, 0); 51 Button btnSTA = new Button("Strat"); 52 Button btnSTO=new Button("Stop"); 53 54 //ラムダ式でstartSWとstopSWのイベント処理を書きました。 55 @Override 56 public void start(Stage primaryStage) { 57 58 btnSTA.setOnAction(event-> { 59 60 startSW(); 61 }); 62 63 btnSTO.setOnAction(event->{ 64 65 stopSW(); 66 }); 67 68 //フォントサイズの指定 69 labelTime1.setFont(new Font(50)); 70 71 //レイアウトはHBoXとVBoxの組み合わせで行いました。 72 73 HBox HBox=new HBox(); 74 HBox.setAlignment(Pos.CENTER); 75 //HBox、横方向(H)にlabelTime1を整列させよ 76 HBox.getChildren().addAll(labelTime1); 77 78 HBox HBox2=new HBox(); 79 HBox2.setAlignment(Pos.CENTER); 80 //HBox2、横方向(H)にlbtnSTAとbtnSTOを整列させよ 81 HBox2.getChildren().addAll(btnSTA,btnSTO); 82 83 VBox VBox = new VBox(); 84 VBox.setAlignment(Pos.CENTER); 85 VBox.setSpacing(20.0); 86 //VBox、縦方向(V)にHBoxとHbox2を整列させよ 87 VBox.getChildren().addAll(HBox,HBox2); 88 89 Scene scene = new Scene(VBox,300, 250); 90 91 primaryStage.setTitle("ストップウォッチ"); 92 primaryStage.setScene(scene); 93 primaryStage.show(); 94 } 95 96 //各呼び出され側のメゾットの内容です。 97 public void startSW(){ 98 System.out.println(" startSWメゾット起動"); 99 this.timeA=Instant.now(); 100 pendulum(); 101 //pendulum 和訳「振り子」 102 } 103 104 public void pendulum() { 105 System.out.println("pendulumメゾット起動"); 106 107 /*Timelineインスタンス作成、同時にKeyFrameインスタンスも作成し、 108 1000millisごとのアニメーション動作を指定*/ 109 Timeline timeline = 110 new Timeline( 111 new KeyFrame( 112 javafx.util.Duration.millis(1000), 113 /*KeyFrameのコンストラクタの引数である、 114 インターフェースEventHandler<actionevent>を実装、 115 (ActionEvent型の引数としてeventを渡す)*/ 116 event->{ 117 //現在時刻を取得 118 this.timeB=Instant.now(); 119 timecalcu(); 120 labelTime1.setText(display); 121 } 122 ) 123 ); 124 //アニメーションの作動時間は無限とする。 125 timeline.setCycleCount(Timeline.INDEFINITE); 126 //アニメーション開始 127 timeline.play(); 128 129 /*もしストップボタンのスイッチがtrueであるならばStopせよ*/ 130 if(stopSW==true){ 131 132 timeline.stop(); 133 System.out.println("お願いだから止っておくれ"); 134 135 } 136 137 138 } 139 public void timecalcu(){ 140 System.out.println("timecalcuメゾット起動"); 141 142 //ローカル変数 143 long longans; 144 LocalTime LocalTimeans; 145 Instant Instantans; 146 ZonedDateTime ZonedDatetimeans; 147 148 //Duration.betweenに2つの瞬間時間を引渡し、かかった時間をduratonansにリターンさせる。 149 this.durationans=Duration.between(timeA,timeB); 150 151 /*2018年7月現在、Durationクラスには文字列へのフォーマッタが準備されていない(!) 152 仕方がないのでlong型と他の日付クラスを介してString型に変換する。*/ 153 154 // longans=durationans.getSeconds(); これだとうまくいかない。 155 156 //duration型からlong型に変換する。 157 longans=durationans.toMillis(); 158 159 /*<参考> this.display=""+longans; 160 JDKの自動型変換のルールを利用してlong型からStrng型へ変換する方法も見つけた。*/ 161 162 //long型からInstant型へ変換する。 163 Instantans=Instant.ofEpochMilli(longans); 164 165 //Instant型からZonedDateTimeTime型へ変換する。 166 ZonedDatetimeans=Instantans.atZone(ZoneId.of("Asia/Tokyo")); 167 168 //ZonedDateTimeTime型からLocalTime型へ変換する。 169 LocalTimeans=ZonedDatetimeans.toLocalTime(); 170 171 //9時間の時差の分を調整する。 172 LocalTimeans=LocalTimeans.minusHours(9); 173 174 //LocalTime型からString型へ変換する。(予め準備しておいたformatter1を使用している) 175 display=formatter1.format(LocalTimeans); 176 177 System.out.println(display); 178 } 179 180 public void stopSW() { 181 System.out.println("stopSWメゾット起動"); 182 this.stopSW=true; 183 System.out.println(this.stopSW); 184 185 //event->{timeline.stop()}; 186 187 } 188 189 //JavaFXはmainから起動する。 190 public static void main(String[] args) { 191 launch(args); 192 } 193} 194
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/09 14:16