在运行时JavaFX中更改画布颜色

问题描述 投票:0回答:2

所以我做了一点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();
    }

}

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

感谢您的帮助!

java javafx canvas
2个回答
0
投票

简短回答您可以使用这部分代码进行所需的行为

   Runnable collide = new Runnable() {
        @Override
        public void run() {
            Platform.runLater(() ->
                damageEffect()
            );
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Platform.runLater(() ->
                resetEffect()
            );
        }
    };
    new Thread(collide).start();

说明您不能在会导致UI冻结的主线程上使用Thread.Sleep(),因此您需要在另一个线程上使用它,并且为了更安全地更改UI / Main线程中的任何内容,您应该使用Platform.runLater()

您可以在这些函数boomEffect()resetEffect()中编写任何效果如果要更改画布填充颜色,可以使用@Barudar在注释中提供的代码,例如:

private void resetEffect() {
    canvas.getGraphicsContext2D().setFill(Color.RED);
    canvas.getGraphicsContext2D().fillRect(0,0,canvas.getWidth(),canvas.getHeight());
}

其中fillRect()将startingX,startingY,endX,endY作为参数


0
投票

您正在使用Thread.sleep阻止JavaFX应用程序线程,这会阻止呈现更改。 (在您的代码中实际上没有任何变化,因为您只是替换了用于绘制的颜色,并假设该颜色未在其他任何地方使用,但是如果您除了修改[C0 ]属性。)

© www.soinside.com 2019 - 2024. All rights reserved.