在我的程序中,我想通过MenuItem打开和关闭暗模式。它正在运行,但是我有一个小问题,我不知道是什么导致了此问题。
问题是,我必须在selectedProperty
做某件事之前选择CheckMenuItem服务器次数。
如果运行我的mvce,您应该会看到它(我认为您必须单击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();
}
}
任何人都可以解释为什么会这样吗? 这是代码中的错误还是错误?
答案 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");
}
});