首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时JavaFX中更改画布颜色

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

Stack Overflow用户
提问于 2019-10-06 20:59:25
回答 2查看 658关注 0票数 0

所以我对javaFX做了一些实验,因为它是我的一门学科的一部分。我有一个弹射器向某个方向射出一个球。我想知道你是否可以在运行时改变画布背景的颜色--例如,当一个球撞到墙上时。我已经想出了如何让球在墙上弹跳,但我不知道如何在运行时改变bg颜色。

我使用的是导入javafx.scene.canvas.GraphicsContext,因为这是我们需要使用的。

我想像这样的东西会起作用,我找到了一些关于睡眠的线索,所以我试了一试。

代码语言:javascript
复制
public void flashCanvas() {

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

}

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

谢谢你帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-07 08:39:59

短答案

您可以使用代码的这一部分进行您想要的行为。

代码语言:javascript
复制
   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冻结,因此您需要在另一个线程上使用Thread.Sleep(),并且在更改UI/主线程中的任何内容时需要使用Platform.runLater()

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

代码语言:javascript
复制
private void resetEffect() {
    canvas.getGraphicsContext2D().setFill(Color.RED);
    canvas.getGraphicsContext2D().fillRect(0,0,canvas.getWidth(),canvas.getHeight());
}

其中fillRect()以startingX、startingY、endX、endY作为参数

票数 0
EN

Stack Overflow用户

发布于 2019-10-07 19:09:39

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

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

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

使用PauseTransition**:**的示例

代码语言:javascript
复制
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();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58261181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档