在我的程序中,我想通过MenuItem打开和关闭暗模式。它正在运行,但是我有一个小问题,我不知道是什么导致了此问题。
问题是,我必须在selectedProperty
做某事之前选择CheckMenuItem服务器次数。
如果您运行我的电视,您应该会看到它(我认为您必须单击3次)。但是selectedProperty
首次激活后,它可以正常工作,直到您重新启动应用程序。
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上的selection属性分配一个新的侦听器,该侦听器将侦听是否要选择menuItem 下次,因此将应用任何操作,因此第一个操作不计入下一个操作是取消选择您要使用的菜单项,什么也不做,然后再次选择它以执行所需的操作,因此无需使两个侦听器访问同一属性,您只需使侦听器更改选择属性即可。
checkMenuItem.selectedProperty().addListener((obs, wasSelected, isSelected) -> {
if (isSelected) {
pane.setStyle("-fx-background-color: black");
}
else {
pane.setStyle("-fx-background-color: white");
}
});
这是实现此[[::)的简单方法 checkMenuItem.setOnAction(event -> {
if (checkMenuItem.isSelected()) {
pane.setStyle("-fx-background-color: black");
} else {
pane.setStyle("-fx-background-color: white");
}
});