java在一个函数中更改按钮背景两次
我想用javaFX做“记忆游戏”。我现在要处理的是在点击这个按钮后,使用CSS在一个函数中两次更改按钮的背景
在这个游戏中,我创建了一个网格窗格,在每个单元格中我放置了带有图片的按钮,每个图片有两个按钮。在上面我又放了一个空按钮。如果我点击一个按钮,它就会变成透明的,这样我就可以看到图片了。然后我点击了另一个按钮,同样的情况也发生了。现在,如果图片相同,我得到一个点,透明度不变,但如果图片不同,程序会等待一秒钟,然后将两个按钮更改为其主阶段(不透明)
问题是,如果我更改按钮的样式,请稍等片刻,然后再更改一次,则该按钮在此函数期间不会更改其样式,但会在函数结束后更改。所以我们看不到第一种风格,只有最后一种
我发送的代码是简化版,只对一个按钮有效
public void changeTransparent(ActionEvent event) {
butCver01.setStyle("-fx-background-color: transparent");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
butCver01.setStyle("-fx-background-color: green");
}
现在,当我们单击butCver01时,一秒钟后它将变为绿色
# 1 楼答案
正如我在评论中提到的,JavaFX应用程序线程无法在仍在执行您的方法时安排下一帧渲染(即“脉冲”)。更复杂的是,你使用
Thread.sleep
来阻止FX线程,这意味着它不能做任何事情,更不用说安排下一个脉冲了。一个被阻止的FX线程等于一个冻结的UI,你的用户将无法点击更多的卡来尝试获得匹配您应该使用animation API在FX线程上“随时间”执行操作。动画是“异步”执行的(在FX线程上),这意味着可以在动画运行时处理其他动作。启动动画的调用也会立即返回。下面是一个例子,它将在一秒钟内显示矩形下方的一个形状;然而,没有逻辑来确定是否显示两个匹配的形状,一次只显示两个形状,等等