JavaFXの:なぜ私は、背景が変化する前にボタンを数回押す必要があるのですか?

poisn:

私のプログラムの開発では、私は、MenuItemに介して、オンとオフの暗いモードを切り替えたいです。そして、それは働いているのですが、私は少し問題をしたと私は、この問題の原因を理解していません。

問題は、私は前にCheckMenuItemのserveral時間を選択したこと、であるselectedProperty何かをやっています。

あなたは私のMVCEを実行した場合、あなたはそれを見る必要があります(私はあなたがそれを3回クリックする必要が思います)。後でもselectedProperty初めてアクティブであったアプリケーションを再起動するまで、それは何の問題もなく動作します。

MVCE

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.MenuButton;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class DarkModeMVCE extends Application {

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        BorderPane pane = new BorderPane();
        Scene scene = new Scene(pane, 500, 500);

        MenuButton menuButton = new MenuButton("Menu");
        CheckMenuItem checkMenuItem = new CheckMenuItem("Darkmode");
        checkMenuItem.setSelected(false);

        checkMenuItem.setOnAction(aE -> checkMenuItem.selectedProperty().addListener((obs, wasSelected, isSelected) -> {

            if (isSelected) {
                pane.setStyle("-fx-background-color: black");
            }
            else {
                pane.setStyle("-fx-background-color: white");
            }

        }));

        menuButton.getItems().add(checkMenuItem);

        pane.setCenter(menuButton);

        primaryStage.setScene(scene);
        primaryStage.setTitle("MVCE");
        primaryStage.show();
    }
}

なぜこれが起こっている誰もが説明していただけますか?これはバグやコードのエラーですか?

アーメドエマド:

setOnAction()リスナーは任意のアクションに耳を傾け、あなたがメニューアイテムをクリックしたときにそれがリスナー内のコードを実行したMenuItemに適用される
のmenuItemを選択するつもりであるかどうかを聞くつもりのmenuItemの選択のプロパティに、この時点では、新しいリスナーアサイン次回は、任意のアクションは、最初のアクションがカウントされませんので、あなたは、次はあなたのケースでは何もして、もう一度それを再選択がすることができます同じプロパティに2人のリスナーを作成する必要はありませんので、必要なアクションをしないでくださいwhchiのmenuItem選択解除で適用されますちょうど選択特性の変化にリスナーを作ります

checkMenuItem.selectedProperty().addListener((obs, wasSelected, isSelected) -> {

    if (isSelected) {
        pane.setStyle("-fx-background-color: black");
    }
    else {
        pane.setStyle("-fx-background-color: white");
    }

});

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=318165&siteId=1