###前提・実現したいこと
Scene BuilderとJavaFXを使ってシミュレーターを作ろうとしています.
ここで実装したい処理は
・時間tに依存する関数を用いて計算した座標を用いて,AnchorPane上に配置したCanvasに物体を描画(初期配置).
・時間tを規定の量だけ増やし,再計算し,その座標でまた物体をCanvasに再描画.
なのですが,再描画処理をどのように行えばよいのか分からず,詰まってしまいました.
以下に初期配置のみを行い,単純化したソースコードを示します.物体はここでは正方形としています.
###該当のソースコード
Java
1//FXTest2.fxml 2 3<?xml version="1.0" encoding="UTF-8"?> 4 5<?import javafx.scene.canvas.Canvas?> 6<?import javafx.scene.layout.AnchorPane?> 7 8<AnchorPane xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sim.FXTest2Controller"> 9 <children> 10 <AnchorPane layoutX="-98.0" layoutY="-90.0" prefHeight="500.0" prefWidth="500.0"> 11 <children> 12 <Canvas fx:id="Canvas" height="348.0" layoutX="115.0" layoutY="109.0" width="270.0" AnchorPane.leftAnchor="115.0" AnchorPane.topAnchor="109.0" /> 13 </children> 14 </AnchorPane> 15 </children> 16</AnchorPane> 17
Java
1//FXTest2Controller.java 2 3package sim; 4 5 6import javafx.fxml.FXML; 7import javafx.fxml.Initializable; 8import java.net.URL; 9import java.util.ResourceBundle; 10import javafx.scene.paint.Color; 11import javafx.scene.canvas.GraphicsContext; 12import javafx.scene.canvas.Canvas; 13 14public class FXTest2Controller implements Initializable { 15 @FXML Canvas Canvas; 16 GraphicsContext gc; 17 double x=0; 18 double y=0; 19 20 public void initialize(URL location, ResourceBundle resources) { 21 gc = Canvas.getGraphicsContext2D(); 22 draw(x , y); 23 } 24 25 public void draw(double x , double y) { 26 27 //ここで初期配置を行っているものとして見てください. 28 gc.setFill(Color.RED); 29 gc.fillRect(x, y, 10, 10); 30 31 } 32} 33 34
Java
1//Main.java 2 3package sim; 4 5import javafx.application.Application; 6import javafx.stage.Stage; 7import javafx.scene.Scene; 8import javafx.scene.canvas.Canvas; 9import javafx.scene.canvas.GraphicsContext; 10import javafx.scene.layout.AnchorPane; 11import javafx.scene.paint.Color; 12import javafx.fxml.FXMLLoader; 13import javafx.fxml.FXML; 14 15public class Main extends Application { 16 17 @Override 18 public void start(Stage primaryStage) { 19 20 try { 21 AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("FXTest2.fxml")); 22 Scene scene = new Scene(root,400,400); 23 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 24 primaryStage.setScene(scene); 25 primaryStage.show(); 26 } catch(Exception e) { 27 e.printStackTrace(); 28 } 29 } 30 31 public static void main(String[] args) { 32 launch(args); 33 } 34} 35 36
###試したこと
Mainメソッドの始めに
public class Main extends Application { @FXML Canvas Canvas; GraphicsContext gc; double x=0; double y=0; int t=0; @Override public void start(Stage primaryStage) { gc = Canvas.getGraphicsContext2D(); ・ ・ ・
と追加し,末尾に再描画を行おうと,
while(true) { /* * ここでxとy座標を再計算したとして見てください */ gc.setFill(Color.RED); gc.fillRect(x, y, 10, 10); //計算した座標に従い描画 t += 1; //空白時間を設ける try{ Thread.sleep(30); }catch(InterruptedException e){} }
とwhile文を追加したのですが
java.lang.reflect.InvocationTargetException
というエラーがでてしまいました.
知識が不十分で申し訳ないのですが,正しいCanvasへの再描画処理の方法をご教授頂ければ幸いです.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/13 08:27