所以我对javaFX做了一些实验,因为它是我的一门学科的一部分。我有一个弹射器向某个方向射出一个球。我想知道你是否可以在运行时改变画布背景的颜色--例如,当一个球撞到墙上时。我已经想出了如何让球在墙上弹跳,但我不知道如何在运行时改变bg颜色。
我使用的是导入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();
}
}我以为这只会改变颜色,然后再等一次。
谢谢你帮忙!
发布于 2019-10-07 08:39:59
短答案
您可以使用代码的这一部分进行您想要的行为。
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提供的代码,如下所示
private void resetEffect() {
canvas.getGraphicsContext2D().setFill(Color.RED);
canvas.getGraphicsContext2D().fillRect(0,0,canvas.getWidth(),canvas.getHeight());
}其中fillRect()以startingX、startingY、endX、endY作为参数
发布于 2019-10-07 19:09:39
您正在使用JavaFX阻止更改呈现的Thread.sleep应用程序线程。(在您的代码中,实际上没有任何更改,因为您只是在替换用于绘制的颜色,假设该颜色不在其他任何地方使用,但如果您除了修改fill属性之外还绘制了一些东西,这将发生什么情况。)
我建议使用javafx.animation package中的一个类来更改这一点。
在这种情况下,PauseTransition似乎是最简单的方法,但是如果您想要包含一个更新循环,我建议使用AnimationTimer或Timeline,并将这种逻辑集成到更新“循环”中。使用后一种可能性,您可以简单地保存最后一次球击中墙壁,并决定根据这一信息,使用哪种颜色来绘制背景。
使用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();请注意,您可能需要重新绘制的不仅仅是背景,因为使用fillRect替换了当前矩形中的所有内容。
https://stackoverflow.com/questions/58261181
复制相似问题