JavaFX:为什么我必须按几次按钮才能背景改变?

在我的程序中,我想通过 MenuItem 打开和关闭暗模式。它正在工作,但我有一个小问题,我不明白是什么导致了这个问题。


selectedProperty问题是,我必须在执行某些操作之前多次选择 CheckMenuItem 。


如果你运行我的 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();

    }

}

任何人都可以解释为什么会发生这种情况吗?这是代码中的错误还是错误?


慕娘9325324
浏览 84回答 2
2回答

饮歌长啸

setOnAction()侦听器侦听适用于 MenuItem 的任何操作,因此当您单击 menuItem 时,它会执行侦听器内的代码,此时将一个新侦听器分配给 menuItem 上的选择属性,该侦听器将侦听是否选择 menuItem下次应用任何操作时,第一个操作不会被计算在内,接下来您要做的是取消选择 menuItem,在您的情况下不执行任何操作,然后再次重新选择它以执行所需的操作,因此无需为同一属性设置两个侦听器只需监听选择属性的变化checkMenuItem.selectedProperty().addListener((obs, wasSelected, isSelected) -> {    if (isSelected) {        pane.setStyle("-fx-background-color: black");    }    else {        pane.setStyle("-fx-background-color: white");    }});

Cats萌萌

setOnAction()侦听器侦听适用于 MenuItem 的任何操作,因此当您单击 menuItem 时,它会执行侦听器内的代码,此时将一个新侦听器分配给 menuItem 上的选择属性,该侦听器将侦听是否选择 menuItem下次应用任何操作时,第一个操作不会被计算在内,接下来您要做的是取消选择 menuItem,在您的情况下不执行任何操作,然后再次重新选择它以执行所需的操作,因此无需为同一属性设置两个侦听器只需监听选择属性的变化checkMenuItem.selectedProperty().addListener((obs, wasSelected, isSelected) -> {    if (isSelected) {        pane.setStyle("-fx-background-color: black");    }    else {        pane.setStyle("-fx-background-color: white");    }});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java