亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在一個函數中兩次更改按鈕背景

在一個函數中兩次更改按鈕背景

長風秋雁 2022-12-21 15:22:03
我正在嘗試在 javaFX 中做“memoryGame”。我現在正在處理的是在單擊此按鈕后,使用 CSS 在一個函數中更改按鈕的背景兩次。在這個游戲中,我創建了一個 GridPane 并在每個單元格中放置了帶有圖片的按鈕,每張圖片都有兩個按鈕。在它上面我放了另一個空按鈕。如果我點擊一個按鈕,它會變成透明的,所以我可以看到圖片。然后我點擊了另一個按鈕,同樣的事情發生了?,F在,如果圖片相同,我會得到一分,透明度不會改變,但如果圖片不同,程序會等待一秒鐘,然后將兩個按鈕都更改為它們的主要階段(不透明)。問題是,如果我更改按鈕的樣式,請稍等一下,然后再更改一次,按鈕在此功能期間不會更改其樣式,但會在功能結束后發生。所以我們看不到第一個樣式,只能看到最后一個。我發送的代碼是簡化版本,僅對一個按鈕“有效”。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 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

正如我在評論中提到的,JavaFX 應用程序線程無法在仍在執行您的方法時安排下一幀渲染(即“脈沖”)。您使用Thread.sleepwhich阻塞FX 線程意味著它不能做任何事情,更不用說安排下一個脈沖了。被阻止的 FX 線程等于凍結的 UI,您的用戶將無法點擊更多卡片來嘗試獲得匹配。


您應該使用動畫 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);

    }


}


查看完整回答
反對 回復 2022-12-21
  • 1 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號