JavaFX:逐渐更改绑定(bind)到后台线程中的 DoubleProperty

标签 java multithreading javafx crash thread-safety

这个问题在这里已经有了答案:





JavaFX UI Frozen when performing Task in new Thread

(1 个回答)


5年前关闭。




我正在尝试以编程方式为 JavaFX 中一组矩形的大小调整设置动画,但我遇到的问题很可能是由于线程。

程序在遇到 widthOfRectangles.set(... 时崩溃即使它是后台线程中的一个循环并且它应该停止。我假设设置 DoubleProperty 我所有的矩形宽度都绑定(bind)到 Platform.runLater不会真的工作。

所以我又试了一次,没有Platform.runLater (不是下面显示的代码),但是这一次,它滞后于矩形应该扩展/最小化的持续时间,然后突然跳到结束状态 - 至少它没有崩溃,但它不是平滑的我一直在寻找的动画。

是否可以通过 PropertyBindings 平滑地插入节点的属性,如果是这样,我将如何在不卡住 JavaFX 主线程的情况下进行呢?

expandProgressGraphic = new Thread(new Task<Void>() {
    @Override
    public Void call() throws Exception { 
    while (widthOfRectangles.get() < 130) {
        Platform.runLater(() -> 
        widthOfRectangles.set(widthOfRectangles.get() + (130 - widthOfRectangles.get()) / 3 + 2));

        try {
        Thread.sleep(30);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
    }
    widthOfRectangles.set(130);
    return null;
    }
});
expandProgressGraphic.setDaemon(true);

minimizeProgressGraphic = new Thread(new Task<Void>() {
    @Override
    public Void call() throws Exception {
        while (widthOfRectangles.get() > 40) {
            Platform.runLater(() -> 
                widthOfRectangles.set(widthOfRectangles.get() - (widthOfRectangles.get() - 40) / 3 - 2));
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {e.printStackTrace();}
        }
        widthOfRectangles.set(40);
        return null;
    }
});
expandProgressGraphic.setDaemon(true);


pane.setOnMouseMoved(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        if(widthOfRectangles.get() != 130 && event.getX() < widthOfRectangles.get() && !expandProgressGraphic.isAlive()) {
            expandProgressGraphic.run();
        } else if(widthOfRectangles.get() != 40 && event.getX() > widthOfRectangles.get() && !minimizeProgressGraphic.isAlive()){
            minimizeProgressGraphic.run();
        }
    }
});

最佳答案

再次感谢@sillyfly。

我应该使用 Thread.start()而不是 Thread.run()

关于JavaFX:逐渐更改绑定(bind)到后台线程中的 DoubleProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38523132/

相关文章:

javafx 匿名应用程序类

java - 如何从黑莓应用程序发送 smtp 电子邮件

c# - 等待后线程阻塞

java - 使用java的monitor如何解决生产者和消费者问题?

java - 在 JavaFX TextField 中输入文本会卡住应用程序

gradle - JavaFX,如何使用 “import java.util.Random;”, 'Cannot resolve symbole “java”。在 Gradle 下

java - 如何使用 Picasso 从 .mp3 文件中检索专辑封面

java - choco 求解器中的资源分配

java - 如何在spring mvc中的servlet xml文件中导入xml文件

c# - 线程同步。 lock 究竟是如何访问内存 'correct' 的?