2016-10-27 25 views
0

私は、キャンバス上に一度に1行ずつ線を描画するjava FXアプリケーションを作成したいと思います。下のアプリケーションでは、私が想像したように、対角線を描き、1秒間ストールしてから次の対角線を描きます。代わりに、FXウィンドウが空白になり、2秒間待ってから、2つの対角線を同時に表示します。私が探している効果をどのように達成するのですか? javafx.scene.canvas.Canvasは正しいオブジェクトではありませんか?Java FXキャンバスが完了するまで表示されない

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 

import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.paint.Color; 

public class FrameCanvas extends Application{ 
    public static void main(String[] args){ 
    launch(args); 
    } 
    @Override 
    public void start(Stage primaryStage)throws Exception{ 
    ////////////////////Basic FX stuff 
    Canvas theCanvas = new Canvas(900,900); 
    StackPane theLayout = new StackPane(); 
    theLayout.getChildren().add(theCanvas); 
    Scene theScene = new Scene(theLayout,900,900); 
    primaryStage.setScene(theScene); 
    primaryStage.show(); 
    /////////////////////// 
    /////Drawing an X 
    /////////////////////// 
    GraphicsContext gc = theCanvas.getGraphicsContext2D(); 
    Thread.sleep(1000); 
    gc.strokeLine(0,0,200,200); 
    Thread.sleep(1000); 
    gc.strokeLine(200,0,0,200); 
    ///////////////////////////// 
    } 
} 

答えて

4

FXアプリケーションスレッドをブロックしないでください(例:Thread.sleep(...))。そのスレッドはシーンのレンダリングを担当しているため、更新がレンダリングされないようにします。

代わりに、このような機能のためのアニメーションを使用します(結局、アニメーションはあなたがここに作成している、本当に何である):

public void start(Stage primaryStage)throws Exception{ 
    ////////////////////Basic FX stuff 
    Canvas theCanvas = new Canvas(900,900); 
    StackPane theLayout = new StackPane(); 
    theLayout.getChildren().add(theCanvas); 
    Scene theScene = new Scene(theLayout,900,900); 
    primaryStage.setScene(theScene); 
    primaryStage.show(); 
    /////////////////////// 
    /////Drawing an X 
    /////////////////////// 
    GraphicsContext gc = theCanvas.getGraphicsContext2D(); 

    Timeline timeline = new Timeline(
     new KeyFrame(Duration.seconds(1), e -> gc.strokeLine(0,0,200,200)), 
     new KeyFrame(Duration.seconds(2), e -> gc.strokeLine(200,0,0,200)) 
    ); 
    timeline.play(); 
    ///////////////////////////// 
} 
+0

私は、キープレスイベントハンドラでこれを行うことができますどのように私たびスペースバーを押すと、次の行が描画されますか? – SeanLetendre

+0

行のデータをリストに入れます。ハンドラでは、リストの最初の要素を削除し、それを使って線を描画します。 –

関連する問題