JavaFX:逐渐改变在后台线程中受限制的DoubleProperty

时间:2016-07-22 09:39:33

标签: java multithreading javafx crash thread-safety

我正在尝试以编程方式为JavaFX中的一组矩形的大小调整设置动画,但我很可能因为线程而出现问题。

程序在widthOfRectangles.set(...时崩溃,即使它是后台线程中的循环并且它应该停止。我假设设置DoubleProperty所有我的矩形宽度都绑定在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();
        }
    }
});

1 个答案:

答案 0 :(得分:0)

再次感谢@sillyfly。

我应该使用Thread.start()代替Thread.run()