gpt4 book ai didi

java - 在一个功能内更改按钮背景两次

转载 作者:行者123 更新时间:2023-12-01 19:38:37 24 4
gpt4 key购买 nike

我正在尝试在 javaFX 中执行“memoryGame”。我现在正在处理的是在单击该按钮后,使用 CSS 在一个函数中更改按钮的背景两次。

在这个游戏中,我创建了一个 GridPane,并在每个单元格中放置了带有图片的按钮,每张图片都有两个按钮。在它上面我放了另一个空按钮。如果我点击一个按钮,它就会变得透明,这样我就可以看到图片。然后我点击另一个按钮,同样的事情发生了。现在,如果图片相同,我会得到一分,并且透明度不会改变,但如果图片不同,程序会等待一秒钟,然后将两个按钮更改为其主要阶段(不透明)。

问题是,如果我更改按钮的样式,稍等一下再更改一次,按钮在此函数期间不会更改其样式,但会在函数结束后发生。所以我们看不到第一种样式,只能看到最后一种。

我发送的代码是简化版本,仅适用于一个按钮。

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时,一秒钟后它将变为绿色。

最佳答案

正如我在评论中提到的,JavaFX 应用程序线程在仍在执行您的方法时无法安排下一帧渲染(即“脉冲”)。由于您使用 Thread.sleep,这会阻塞 FX 线程,这意味着它无法执行任何操作,更不用说安排下一个线程了脉冲。 FX 线程被阻止就等于 UI 被卡住,您的用户将无法单击任何更多卡片来尝试获得匹配。

您应该使用animation API在 FX 线程上“随着时间的推移”执行操作。动画是“异步”执行的(在 FX 线程上),这意味着在动画运行时可以处理其他 Action 。启动动画的调用也会立即返回。这是一个示例,将显示矩形下方的形状一秒钟;但是,没有逻辑可以确定是否显示两个匹配的形状,一次仅显示两个形状,等等。

import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

@Override
public void start(Stage primaryStage) {
HBox box = new HBox(10, createCard(true), createCard(true), createCard(false));
box.setPadding(new Insets(100));
primaryStage.setScene(new Scene(box));
primaryStage.show();
}

private StackPane createCard(boolean circle) {
Shape shape;
if (circle) {
shape = new Circle(50, Color.FORESTGREEN);
} else {
// create triangle
shape = new Polygon(0, 0, 50, 100, -50, 100);
shape.setFill(Color.FIREBRICK);
}

Rectangle cover = new Rectangle(0, 0, 100, 150);
cover.mouseTransparentProperty()
.bind(cover.fillProperty().isEqualTo(Color.TRANSPARENT));
cover.setOnMouseClicked(event -> {
event.consume();

cover.setFill(Color.TRANSPARENT);

PauseTransition pt = new PauseTransition(Duration.seconds(1));
pt.setOnFinished(e -> cover.setFill(Color.BLACK));
pt.playFromStart();
});
return new StackPane(shape, cover);
}

}

关于java - 在一个功能内更改按钮背景两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56374001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com