threadを使った、カウントダウンタイマーを作成しようとしています。
コマンド画面では、カウントダウンが表示できますが、labelの更新がうまくできません。
lbTime.setText(min+":"+sec);
の部分で以下のエラーが出ています。
アドバイス頂ければ幸いです。
よろしくお願い致します。
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at finalProject$MyRunnable.lambda$run$0(finalProject.java:88) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
Threadのコードになります。
Java
1public class MyRunnable implements Runnable 2 { 3 @Override 4 public void run() 5 { 6 while(true) 7 { 8 s = timeleft - counter; 9 min = s / 60; 10 sec = s % 60; 11 System.out.println(min+":"+sec); 12 Platform.runLater( 13 () -> lbTime.setText(min+":"+sec)); 14 try{ 15 Thread.sleep(1000); 16 counter++; 17 }catch(InterruptedException e) 18 { 19 System.out.println(e); 20 } 21 } 22 } 23 }
全体のコード
Java
1import javafx.application.*; 2import javafx.scene.*; 3import javafx.scene.layout.*; 4import javafx.scene.control.*; 5import javafx.scene.paint.*; 6import javafx.scene.image.*; 7import javafx.scene.effect.*; 8import javafx.scene.text.*; 9import javafx.scene.input.*; 10import javafx.scene.canvas.*; 11import javafx.scene.shape.*; 12import javafx.stage.*; 13import javafx.event.*; 14import javafx.geometry.*; 15import javafx.collections.*; 16import java.util.*; 17 18public class finalProject extends Application 19{ 20 private int counter; 21 private int timeleft; 22 private Label lbTime; 23 private int s; 24 private int min; 25 private int sec; 26 private MyRunnable runnable; 27 private Thread thread; 28 29 public void start(Stage stage) throws Exception 30 { 31 timeleft = 65; 32 33 ImageView icon1 = new ImageView("setting.png"); 34 35 Label[] lbs = new Label[2]; 36 lbs[0] = new Label(); 37 lbs[1] = new Label("進捗状況"); 38 lbs[0].setGraphic(icon1); 39 40 Label lbTasks = new Label("Tasks"); 41 Label lbTime = new Label("00:00"); 42 43 Button btPlay = new Button("PLAY"); 44 Button btReset = new Button("RESET"); 45 btPlay.setGraphic(new ImageView("play.png")); 46 btPlay.setId("play"); 47 btReset.setGraphic(new ImageView("reset.png")); 48 btReset.setId("reset"); 49 50 ButtonEventHandler bh = new ButtonEventHandler(); 51 btPlay.addEventHandler(ActionEvent.ANY, bh); 52 btReset.addEventHandler(ActionEvent.ANY, bh); 53 54 runnable = new MyRunnable(); 55 thread = new Thread(runnable); 56 57 GridPane gp = new GridPane(); 58 gp.add(btPlay, 0, 0); 59 gp.add(btReset, 1, 0); 60 gp.setBackground(null); 61 62 VBox vb = new VBox(); 63 ObservableList<Node> lst = vb.getChildren(); 64 lst.addAll(lbs); 65 lst.add(lbTime); 66 lst.addAll(gp); 67 lst.add(lbTasks); 68 69 Scene scene = new Scene(vb, 500, 500); 70 scene.setFill(Color.LIGHTGRAY); 71 72 stage.setScene(scene); 73 stage.setTitle("Pomodoro"); 74 stage.setResizable(false); 75 76 stage.show(); 77 } 78 79 public class MyRunnable implements Runnable 80 { 81 @Override 82 public void run() 83 { 84 while(true) 85 { 86 s = timeleft - counter; 87 min = s / 60; 88 sec = s % 60; 89 System.out.println(min+":"+sec); 90 Platform.runLater( 91 () -> lbTime.setText(min+":"+sec)); 92 try{ 93 Thread.sleep(1000); 94 counter++; 95 }catch(InterruptedException e) 96 { 97 System.out.println(e); 98 } 99 } 100 } 101 } 102 103 private class ButtonEventHandler implements EventHandler<ActionEvent> 104 { 105 public void handle(ActionEvent e) 106 { 107 Button bt = (Button)e.getTarget(); 108 String id = bt.getId(); 109 if(id.equals("play")){ 110 thread.start(); 111 } 112 if(id.equals("reset")){ 113 114 } 115 } 116 } 117 118 public static void main(String[] args) 119 { 120 launch(args); 121 } 122} 123
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。