Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 在JavaFX画布上延迟绘制线条_User Interface_Javafx - Fatal编程技术网

User interface 在JavaFX画布上延迟绘制线条

User interface 在JavaFX画布上延迟绘制线条,user-interface,javafx,User Interface,Javafx,我在JavaFX画布上画两条线时遇到了一个问题。我试图画第一行,1秒后画第二行,但例如,当我在画线的代码行之间使用Thread.sleep(1000)时,程序等待1秒,然后同时画线 //AN EXAMPLE GraphicsContext gc = canvas.getGraphicsContext2D(); drawLine(gc,50,50,120,120); try { Thread.sleep(1000); } catch (InterruptedExceptio

我在JavaFX画布上画两条线时遇到了一个问题。我试图画第一行,1秒后画第二行,但例如,当我在画线的代码行之间使用Thread.sleep(1000)时,程序等待1秒,然后同时画线

//AN EXAMPLE
GraphicsContext gc = canvas.getGraphicsContext2D();
drawLine(gc,50,50,120,120);
try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
drawLine(gc,120,120,150,30);
drawLine是我用来在画布上绘制的函数

void drawLine(GraphicsContext gc, double x1, double y1, double x2, double y2){
    Affine prije = gc.getTransform();
    double dx = x2 - x1, dy = y2 - y1;
    double angle = Math.atan2(dy, dx);
    int len = (int) Math.sqrt(dx * dx + dy * dy);
    Transform transform = Transform.translate(x1, y1);
    transform = transform.createConcatenation(Transform.rotate(Math.toDegrees(angle), 0, 0));
    gc.setTransform(new Affine(transform));
    gc.strokeLine(0, 0, len, 0);
    gc.setTransform(prije);
}
一种方法是使用

你可以选择的另一条路线是使用

import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.concurrent.AtomicInteger;
导入javafx.animation.KeyFrame;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.layout.HBox;
导入javafx.scene.transform.Affine;
导入javafx.scene.transform.transform;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类TestingGround扩展了应用程序
{
HBox根=新的HBox();
公共静态void main(字符串[]args)
{
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage)
{
List lineCoors=new ArrayList();
List lineCoors1=newarraylist(Arrays.asList(50,50,150,50));
List lineCoors2=newarraylist(Arrays.asList(150,50150200));
List lineCoors3=newarraylist(Arrays.asList(15020050200));
List lineCoors4=newarraylist(Arrays.asList(50200,50,50));
lineCoors.add(lineCoors1);
lineCoors.add(lineCoors2);
lineCoors.add(lineCoors 3);
lineCoors.add(lineCoors 4);
画布=新画布(300250);
GraphicsContext gc=canvas.getGraphicsContext2D();
AtomicInteger计数器=新的AtomicInteger();
Timeline Timeline=新的时间线(新的关键帧(持续时间。秒(1),(ActionEvent事件)->{
List tempCoors=lineCoors.get(counter.getAndIncrement());
抽绳(gc,tempCoors.get(0),tempCoors.get(1),tempCoors.get(2),tempCoors.get(3));
}));
timeline.setCycleCount(lineCoors.size());
时间。玩();
primaryStage.setTitle(“绘图操作测试”);
root.getChildren().add(画布);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
无效绘制线(GraphicsContext gc,双x1,双y1,双x2,双y2)
{
仿射prije=gc.getTransform();
双dx=x2-x1,dy=y2-y1;
双角度=数学atan2(dy,dx);
int len=(int)Math.sqrt(dx*dx+dy*dy);
Transform=Transform.translate(x1,y1);
transform=transform.createConcatenation(transform.rotate(数学角度,0,0));
gc.setTransform(新仿射(变换));
气相色谱-斯特罗克林(0,0,len,0);
gc.setTransform(prije);
}
}
一种方法是使用

你可以选择的另一条路线是使用

import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.concurrent.AtomicInteger;
导入javafx.animation.KeyFrame;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.layout.HBox;
导入javafx.scene.transform.Affine;
导入javafx.scene.transform.transform;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类TestingGround扩展了应用程序
{
HBox根=新的HBox();
公共静态void main(字符串[]args)
{
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage)
{
List lineCoors=new ArrayList();
List lineCoors1=newarraylist(Arrays.asList(50,50,150,50));
List lineCoors2=newarraylist(Arrays.asList(150,50150200));
List lineCoors3=newarraylist(Arrays.asList(15020050200));
List lineCoors4=newarraylist(Arrays.asList(50200,50,50));
lineCoors.add(lineCoors1);
lineCoors.add(lineCoors2);
lineCoors.add(lineCoors 3);
lineCoors.add(lineCoors 4);
画布=新画布(300250);
GraphicsContext gc=canvas.getGraphicsContext2D();
AtomicInteger计数器=新的AtomicInteger();
Timeline Timeline=新的时间线(新的关键帧(持续时间。秒(1),(ActionEvent事件)->{
List tempCoors=lineCoors.get(counter.getAndIncrement());
抽绳(gc,tempCoors.get(0),tempCoors.get(1),tempCoors.get(2),tempCoors.get(3));
}));
timeline.setCycleCount(lineCoors.size());
时间。玩();
primaryStage.setTitle(“绘图操作测试”);
root.getChildren().add(画布);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
无效绘制线(GraphicsContext gc,双x1,双y1,双x2,双y2)
{
仿射prije=gc.getTransform();
双dx=x2-x1,dy=y2-y1;
双角度=数学atan2(dy,dx);
int len=(int)Math.sqrt(dx*dx+dy*dy);
Transform=Transform.translate(x1,y1);
transform=transform.createConcatenation(transform.rotate(数学角度,0,0));
gc.setTransform(新仿射(变换));
气相色谱-斯特罗克林(0,0,len,0);
gc.setTransform(prije);
}
}

永远不要休眠JavaFX应用程序线程。使用在FX线程上执行延迟操作。感谢提示,我将查看该包!请参阅永不休眠JavaFX应用程序线程。使用在FX线程上执行延迟操作。感谢提示,我将查看该包!看见
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.HBox;
import javafx.scene.transform.Affine;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TestingGround extends Application
{

    HBox root = new HBox();

    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage)
    {
        primaryStage.setTitle("Drawing Operations Test");
        Group root = new Group();
        Canvas canvas = new Canvas(300, 250);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        drawLine(gc, 50, 50, 120, 120);
        PauseTransition wait = new PauseTransition(Duration.seconds(1));
        wait.setOnFinished((e) -> {
            drawLine(gc, 120, 120, 150, 30);
        });
        wait.play();
        root.getChildren().add(canvas);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    void drawLine(GraphicsContext gc, double x1, double y1, double x2, double y2)
    {
        Affine prije = gc.getTransform();
        double dx = x2 - x1, dy = y2 - y1;
        double angle = Math.atan2(dy, dx);
        int len = (int) Math.sqrt(dx * dx + dy * dy);
        Transform transform = Transform.translate(x1, y1);
        transform = transform.createConcatenation(Transform.rotate(Math.toDegrees(angle), 0, 0));
        gc.setTransform(new Affine(transform));
        gc.strokeLine(0, 0, len, 0);
        gc.setTransform(prije);
    }
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.HBox;
import javafx.scene.transform.Affine;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TestingGround extends Application
{

    HBox root = new HBox();

    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage)
    {
        List<List<Integer>> lineCoors = new ArrayList();
        List<Integer> lineCoors1 = new ArrayList(Arrays.asList(50, 50, 150, 50));
        List<Integer> lineCoors2 = new ArrayList(Arrays.asList(150, 50, 150, 200));
        List<Integer> lineCoors3 = new ArrayList(Arrays.asList(150, 200, 50, 200));
        List<Integer> lineCoors4 = new ArrayList(Arrays.asList(50, 200, 50, 50));

        lineCoors.add(lineCoors1);
        lineCoors.add(lineCoors2);
        lineCoors.add(lineCoors3);
        lineCoors.add(lineCoors4);

        Canvas canvas = new Canvas(300, 250);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        AtomicInteger counter = new AtomicInteger();
        Timeline timeleine = new Timeline(new KeyFrame(Duration.seconds(1), (ActionEvent event) -> {
            List<Integer> tempCoors = lineCoors.get(counter.getAndIncrement());
            drawLine(gc, tempCoors.get(0), tempCoors.get(1), tempCoors.get(2), tempCoors.get(3));
        }));
        timeleine.setCycleCount(lineCoors.size());
        timeleine.play();

        primaryStage.setTitle("Drawing Operations Test");

        root.getChildren().add(canvas);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    void drawLine(GraphicsContext gc, double x1, double y1, double x2, double y2)
    {
        Affine prije = gc.getTransform();
        double dx = x2 - x1, dy = y2 - y1;
        double angle = Math.atan2(dy, dx);
        int len = (int) Math.sqrt(dx * dx + dy * dy);
        Transform transform = Transform.translate(x1, y1);
        transform = transform.createConcatenation(Transform.rotate(Math.toDegrees(angle), 0, 0));
        gc.setTransform(new Affine(transform));
        gc.strokeLine(0, 0, len, 0);
        gc.setTransform(prije);
    }
}