当前位置: 首页 > 知识库问答 >
问题:

在一个功能内两次更改按钮背景[重复]

丘智志
2023-03-14

我正在尝试用JavaFX做“MemoryGame”。我现在要处理的是在单击按钮后,使用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个答案

羊禄
2023-03-14

正如我在评论中提到的,JavaFX应用程序线程不能在执行您的方法时调度下一个帧呈现(即“脉冲”)。使用thread.sleep阻塞FX线程意味着它不能做任何事情,更不用说调度下一个脉冲了。一个阻塞的FX线程等于一个冻结的用户界面,你的用户将无法点击任何更多的卡试图获得匹配。

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

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);
    }

}
 类似资料:
  • 本文向大家介绍使用CSS更改按钮的背景色,包括了使用CSS更改按钮的背景色的使用技巧和注意事项,需要的朋友参考一下 要更改按钮的背景色,请使用background-color属性。 您可以尝试运行以下代码来更改按钮的背景色 示例

  • 我已经创建了一个类,它扩展了。在该类中,当我按下一个按钮时,我想更改一个按钮的背景,该按钮被放置在主活动中。 我试图创建一个内部类来访问Main Active对象,但我得到的是这个错误: 尝试在空对象引用上调用虚拟方法android.content.pm.Application ationInfoandroid.content.Context.getApplication ationInfo()

  • 问题内容: 点击时可以更改背景颜色吗?全部,仅使用CSS和HTML5? 问题答案: 基于我在评论中发布的小提琴,我对它进行了少许修改,以使用Bootstrap按钮CSS。 只需包含Bootstrap的CSS文件,然后使用以下代码即可。 HTML CSS 这将使用相邻的兄弟选择器。 它在这里起作用:(我已经添加了防止选择标签文本的标签,但是标签不是必需的) 浏览器支持 Chrome,Firefox

  • 当我的按钮被按下时,我如何用xml更改文本和背景颜色? 要更改文本颜色,可以执行以下操作: 要更改背景,我可以做(在具有可绘制引用的选择器/项中使用它): 但我怎么能两样都做呢?假设我想要: 默认:黑色文本/白色背景 按下:白文/蓝底 我完全忘记了背景和文本颜色是分开管理的,所以我是这样做的: 在MyBackgroundColors.xml中,我管理背景,在FiltersButtonColors.

  • 我有一个网络表单,我想提交一个PayPal按钮点击。 我能让其中一个工作,但不是两个都能。因此,贝宝按钮是提交表单,然后加载付款页面。此代码仅提交表单,不加载付款页面。 此代码仅加载付款页面: 我错过了什么?我需要第三个按钮来处理其他两个按钮吗?

  • 问题内容: 我需要一个假定具有两个功能的按钮。 如果我点击一次,它将转到下一页。如果我按住按钮,它将允许我编辑按钮上的文本。 单击该按钮可以转到下一页,但是如果我按住该按钮,该如何实现允许我更改文本的第二个功能? 有人知道吗 Java代码 xml代码 问题答案: 您可以将第二个函数设置为setOnLongClickListener: 第一个函数是与setOnclickListener相同的: 检查