poisn:
私のプログラムの開発では、私は、MenuItemに介して、オンとオフの暗いモードを切り替えたいです。そして、それは働いているのですが、私は少し問題をしたと私は、この問題の原因を理解していません。
問題は、私は前にCheckMenuItemのserveral時間を選択したこと、であるselectedProperty
何かをやっています。
あなたは私の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();
}
}
なぜこれが起こっている誰もが説明していただけますか?これはバグやコードのエラーですか?
アーメドエマド:
setOnAction()
リスナーは任意のアクションに耳を傾け、あなたがメニューアイテムをクリックしたときにそれがリスナー内のコードを実行したMenuItemに適用される
のmenuItemを選択するつもりであるかどうかを聞くつもりのmenuItemの選択のプロパティに、この時点では、新しいリスナーアサイン次回は、任意のアクションは、最初のアクションがカウントされませんので、あなたは、次はあなたのケースでは何もして、もう一度それを再選択がすることができます同じプロパティに2人のリスナーを作成する必要はありませんので、必要なアクションをしないでくださいwhchiのmenuItem選択解除で適用されますちょうど選択特性の変化にリスナーを作ります
checkMenuItem.selectedProperty().addListener((obs, wasSelected, isSelected) -> {
if (isSelected) {
pane.setStyle("-fx-background-color: black");
}
else {
pane.setStyle("-fx-background-color: white");
}
});