首页 > 解决方案 > 在运行时 JavaFX 中更改画布颜色

问题描述

所以我对 javaFX 进行了一些试验,因为它是我的一个科目的一部分。我有一个弹射器,可以朝某个方向射球。我想知道您是否可以在特定情况下以某种方式在运行时更改画布背景的颜色 - 例如,当球撞到墙上时。我已经想出了如何让球在墙上反弹,但我不知道如何在运行时改变背景颜色。

我正在使用 import javafx.scene.canvas.GraphicsContext; 因为这是我们“必须”使用的东西。

我认为这样的事情会起作用,我发现了一些关于睡眠的线程,所以我试了一下。

public void flashCanvas() {

try
{
    gc.setFill(Color.WHITESMOKE);
    Thread.sleep(100);
    gc.setFill(Color.BLACK);
    Thread.sleep(100);
}
catch(InterruptedException ex)
{
    Thread.currentThread().interrupt();
    }

}

我以为这只会改变颜色,然后再等等。

感谢帮助!

标签: javajavafxcanvas

解决方案


您正在阻止 JavaFX 应用程序线程,Thread.sleep从而阻止呈现更改。(在您的代码中实际上没有任何变化,因为您只是替换了用于绘制的颜色,假设该颜色未在其他任何地方使用,但如果您除了修改fill属性之外还绘制了一些东西,就会发生这种情况。 )

我建议使用javafx.animation中的一个类来更改它。

在这种情况下,aPauseTransition似乎是最简单的方法,但如果您想包含更新循环,我建议使用AnimationTimerorTimeline并将这种逻辑集成到更新“循环”中。使用后一种可能性,您可以简单地保存球最后一次撞墙的时间,并根据此信息决定使用哪种颜色来绘制背景。

使用示例PauseTransition

gc.setFill(Color.WHITESMOKE);
gc.fillRect(x, y, w, h);

// schedule update without blocking
PauseTransition pause = new PauseTransition(Duration.millis(100));
pause.setOnFinished(evt -> {
    gc.setFill(Color.BLACK);
    gc.fillRect(x, y, w, h);
});
pause.play();

请注意,您可能需要重绘的不仅仅是背景,因为 using 会fillRect替换当前矩形中的所有内容。


推荐阅读