为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕娘9325324 2023-09-20 17:10:25
在我的程序中,我想通过 MenuItem 打开和关闭暗模式。它正在工作,但我有一个小问题,我不明白是什么导致了这个问题。selectedProperty问题是,我必须在执行某些操作之前多次选择 CheckMenuItem 。如果你运行我的 mvce,你应该会看到它(我想你必须点击它 3 次)。但在selectedProperty第一次激活后,它可以正常工作,直到您重新启动应用程序。MVCEimport 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();    }}任何人都可以解释为什么会发生这种情况吗?这是代码中的错误还是错误?
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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

    }


});


查看完整回答
反对 回复 2023-09-20
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

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

    }


});


查看完整回答
反对 回复 2023-09-20
  • 2 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信