java - 在运行时 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();
}
}
我以为这只会改变颜色,然后再等等。
感谢帮助!
解决方案
您正在阻止 JavaFX 应用程序线程,Thread.sleep
从而阻止呈现更改。(在您的代码中实际上没有任何变化,因为您只是替换了用于绘制的颜色,假设该颜色未在其他任何地方使用,但如果您除了修改fill
属性之外还绘制了一些东西,就会发生这种情况。 )
我建议使用javafx.animation
包中的一个类来更改它。
在这种情况下,aPauseTransition
似乎是最简单的方法,但如果您想包含更新循环,我建议使用AnimationTimer
orTimeline
并将这种逻辑集成到更新“循环”中。使用后一种可能性,您可以简单地保存球最后一次撞墙的时间,并根据此信息决定使用哪种颜色来绘制背景。
使用示例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
替换当前矩形中的所有内容。
推荐阅读
- java - Jackson 抽象类型 - 杂项类型
- javascript - 如何使用 Abort Controller 中止从 useEffect 内部启动但由用户操作触发的 API?
- android-emulator - Android模拟器:横向物理键盘上的箭头键
- facebook - 我想知道如何订阅 webhook facebook 的活动帖子
- arrays - Julia:将分类数组转换为数值数组的完美方法是什么?
- javascript - 通知/提醒用户该元素已在使用中?
- xcode12 - Xcode 12 运行问题
- r - 在同一列中仅保留一个重复值并保留 NA
- javascript - Laravel VueJS - 输入值数组返回字符串而不是数组
- python - 未能启用端口 vc.null_sink:in:0(OPQV): ENOSPC