JavaFX:为什么在背景改变之前我必须多次按下按钮?

问题描述 投票:2回答:2

在我的程序中,我想通过MenuItem打开和关闭暗模式。它正在运行,但是我有一个小问题,我不知道是什么导致了此问题。

问题是,我必须在selectedProperty做某事之前选择CheckMenuItem服务器次数。

如果您运行我的电视,您应该会看到它(我认为您必须单击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();
    }
}

谁能解释为什么会这样吗?这是代码中的错误还是错误?

java javafx menuitem
2个回答
1
投票

setOnAction()侦听器侦听适用于MenuItem的任何操作,因此,当您单击menuItem时,它将执行侦听器内的代码它在这一点上为menuItem上的selection属性分配一个新的侦听器,该侦听器将侦听是否要选择menuItem 下次,因此将应用任何操作,因此第一个操作不计入下一个操作是取消选择您要使用的菜单项,什么也不做,然后再次选择它以执行所需的操作,因此无需使两个侦听器访问同一属性,您只需使侦听器更改选择属性即可。

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

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

});

0
投票

这是实现此[[::)的简单方法 checkMenuItem.setOnAction(event -> { if (checkMenuItem.isSelected()) { pane.setStyle("-fx-background-color: black"); } else { pane.setStyle("-fx-background-color: white"); } });

© www.soinside.com 2019 - 2024. All rights reserved.