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

时间:2019-10-02 14:30:25

标签: java javafx menuitem

在我的程序中,我想通过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();
    }
}

任何人都可以解释为什么会这样吗? 这是代码中的错误还是错误?

2 个答案:

答案 0 :(得分:3)

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

});

答案 1 :(得分:0)

这是实现此:-)

的简单方法
    checkMenuItem.setOnAction(event -> {

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

    });