为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2023-09-27 16:09:30
所以我对 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();    }}我以为这只会改变颜色,然后再等等。
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

简短回答

您可以使用这部分代码做出您想要的行为


   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();


说明 您不能Thread.Sleep()在主线程上使用,这会导致您的 UI 冻结,因此您需要在另一个线程上使用它,并且为了在更改 UI/主线程中的任何内容时更安全,您应该使用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作为参数


查看完整回答
反对 回复 2023-09-27
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您正在阻止 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();

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


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信