質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Q&A

解決済

1回答

2997閲覧

JavaFXで作成したアニメーションを一時停止させたい。

yanagiyaryo

総合スコア7

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

0グッド

0クリップ

投稿2016/12/02 08:08

###前提・実現したいこと
JavaFXで教材用の振り子のアニメーションを作成しています。
アニメーションタイマーを使用しています。
スタートボタンでアニメーションを開始させることは出来ましたが、
ストップボタンを押すとエラーメッセージが出ます。
アニメーションを一時停止させるためにはどのようにすればいいでしょうか?
どなたかご教授願います。
###発生している問題・エラーメッセージ
アニメーション実行中にストップボタンを押すと

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at Pendulum.lambda$start$1(Pendulum.java:62) 以下、省略

アニメーションを閉じると

Exception in Application stop method 省略 Exception running application Pendulum

などとエラーが出ます。
###該当のソースコード

JavaFX

1import javafx.application.Application; 2import javafx.scene.Scene; 3import javafx.stage.Stage; 4import javafx.scene.layout.AnchorPane; 5import javafx.scene.control.Button; 6import javafx.scene.control.Label; 7import javafx.scene.control.Slider; 8import javafx.scene.Group; 9import javafx.scene.paint.Color; 10import javafx.animation.AnimationTimer; 11import javafx.scene.shape.Circle; 12import javafx.scene.shape.Line; 13import javafx.event.ActionEvent; 14import javafx.event.EventHandler; 15 16public class Pendulum extends Application { 17 double g, l, y, z, k1, k2, k3, k4, j1, j2, j3, j4, lambda; 18 long dt, t, tmin; 19 int ix = 0; 20 int iy = 300; 21 double linex1 = 500.0; 22 double liney1 = 200.0; 23 double linex2 = 500.0; 24 double liney2 = 200.0; 25 double ballx = 250.0; 26 double bally = 100.0; 27 28 AnimationTimer at; 29 30 @Override 31 public void start(Stage stage) throws Exception { 32 stage.setTitle("単振り子"); 33 stage.setWidth(900); 34 stage.setHeight(900); 35 36 Group root = new Group(); 37 38 //ボタンの配置 39 Button b1 = new Button ("start"); 40 b1.setPrefWidth(100); 41 b1.setPrefHeight(50); 42 Button b2 = new Button ("stop"); 43 b2.setPrefWidth(100); 44 b2.setPrefHeight(50); 45 46 AnchorPane ap = new AnchorPane(); 47 48 AnchorPane.setTopAnchor(b1, 800.0); 49 AnchorPane.setLeftAnchor(b1, 100.0); 50 51 AnchorPane.setTopAnchor(b2, 800.0); 52 AnchorPane.setLeftAnchor(b2, 700.0); 53 54 ap.getChildren().addAll(b1, b2); 55 root.getChildren().add(ap); 56 57 b1.setOnAction((ActionEvent) ->{ 58 SwingAnimation(root); 59 }); 60 61 b2.setOnAction((ActionEvent) ->{ 62 at.stop(); 63 }); 64 65 Scene scene = new Scene(root); 66 scene.setFill(Color.BLACK); 67 stage.setScene(scene); 68 stage.show(); 69 } 70 71 //描画と計算 72 public void SwingAnimation(Group parent){ 73 74 Line string = new Line(linex1, liney1, linex2, liney2); 75 string.setStroke(Color.WHITE); 76 string.setStrokeWidth(1.0); 77 parent.getChildren().add(string); 78 79 Circle ball = new Circle(ballx, bally, 20); 80 ball.setFill(Color.RED); 81 parent.getChildren().add(ball); 82 83 tmin = 0L; 84 g = 9.8; 85 l = 300.0; 86 lambda = 0.0000179; 87 y = 1.0; 88 z = 0.0; 89 ix = (int) (l * Math.sin(y)); 90 iy = (int) (l * Math.cos(y)); 91 double endX1 = linex2 + ix; 92 double endY1 = liney2 + iy; 93 string.setEndX(endX1); 94 string.setEndY(endY1); 95 double endX2 = ballx + ix; 96 double endY2 = bally + iy; 97 ball.setTranslateX(endX2); 98 ball.setTranslateY(endY2); 99 100 AnimationTimer at = new AnimationTimer(){ 101 @Override 102 public void handle(long t){ 103 if( tmin != 0){ 104 double dt = (double)(t - tmin) / 1_000_000_00; 105 Myfunc f = new Myfunc(); 106 k1 = f.f1(t,y,z); 107 j1 = f.f2(t,y,z, g, l, lambda); 108 k2 = f.f1(t+dt/2, y+dt*k1/2, z+dt*j1/2); 109 j2 = f.f2(t+dt/2, y+dt*k1/2, z+dt*j1/2, g, l, lambda); 110 k3 = f.f1(t+dt/2, y+dt*k2/2, z+dt*j2/2); 111 j3 = f.f2(t+dt/2, y+dt*k2/2, z+dt*j2/2, g, l, lambda); 112 k4 = f.f1(t+dt, y+dt*k3, z+dt*j3); 113 j4 = f.f2(t+dt, y+dt*k3, z+dt*j3, g, l, lambda); 114 y = y + dt/6.0*(k1 + 2.0*k2 + 2.0*k3 + k4); 115 z = z + dt/6.0*(j1 + 2.0*j2 + 2.0*j3 + j4); 116 ix = (int) (l * Math.sin(y)); 117 iy = (int) (l * Math.cos(y)); 118 double endX1 = linex2 + ix; 119 double endY1 = liney2 + iy; 120 string.setEndX(endX1); 121 string.setEndY(endY1); 122 double endX2 = ballx + ix; 123 double endY2 = bally + iy; 124 ball.setTranslateX(endX2); 125 ball.setTranslateY(endY2); 126 System.out.println(endX2 +","+ endY2); 127 } 128 tmin = t; 129 } 130 }; 131 at.start(); 132 } 133 134 @Override 135 public void stop(){ 136 at.stop(); 137 } 138 139 public static void main(String... args) { 140 launch(args); 141 } 142} 143 144 145//ルンゲックッタのためのクラス 146class Myfunc{ 147 double f1(double t, double y, double z){ 148 return z; 149 } 150 double f2(double t, double y, double z, double g, double l, double lambda){ 151 return -g/l*Math.sin(y)-2*lambda*z*l; 152 } 153}

###試したこと
様々な文献をあたりましたが、よく分かりません。

###補足情報(言語/FW/ツール等のバージョンなど)
JavaFX(JavaSE8)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

例外が出ている場合は例外の原因をつきとめるためにデバッグしてください。

Pendulum.java:62行目でNullPointerExceptionが発生しています。
=>
62行目で参照しているフィールドatがnullであるためです。
(ヒントははこのフィールドatの初期化ができてないからです。)


追記:ご質問のプログラムのバグは煎じ詰めると以下のようなものです。

java

1public class Test { 2 public static void main(String[] args) { 3 Test test = new Test(); 4 test.method(); 5 } 6 7 String s; // sはフィールド 8 9 Test() { 10 // ここで初期化しているsは本コンストラクターのローカル変数。フィールドsの初期化になっていない 11 String s = "a"; 12 } 13 14 void method() { 15 // フィールドsには何も代入されていない(nullのまま)なので、s.length()を計算する際に例外となる 16 System.out.println(s.length()); // NullPointerException例外発生 17 } 18}

投稿2016/12/05 16:09

編集2016/12/06 09:38
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yanagiyaryo

2016/12/06 08:04

回答ありがとうございます。 完全に理解できたわけではありませんが試してみます。 さらに、詳細に説明頂けると助かります。
yanagiyaryo

2016/12/06 09:59

丁寧なご返答ありがとうございます。 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問