Ok, ich hatte es einfach mit einem Button getestet wie in dem Link. Wenn man es in eine MenuBar und Menu packt, dann ist es tatsächlich so, dass bei ausgewählter Checkbox der Text nicht zu sehen ist, wenn die Maus nicht auf dem Element ist.
Eine Lösung, die ich gefunden habe ist das Setzen der TextFill Property:
box.setTextFill(Paint.valueOf("#000000"));
Ein kleines Testprogramm, in das ich etwas Deinen Code integriert habe:
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import java.util.*;
import javafx.scene.paint.*;
public class CheckMenuKeepOpen extends Application {
private Menu nodeOptions;
private List<CustomMenuItem> items;
private void initDropdown() {
String[] slaves = new String[]{"Slave 1", "Slave 2", "Slave 2"};
if (items == null) {
items = new ArrayList<>();
for (String slave : slaves) {
CheckBox box = new CheckBox(slave);
box.setTextFill(Paint.valueOf("#000000"));
CustomMenuItem menuItem = new CustomMenuItem(box);
menuItem.setHideOnClick(false);
items.add(menuItem);
}
}
nodeOptions.getItems().clear();
nodeOptions.getItems().addAll(items);
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
MenuBar menuBar = new MenuBar();
nodeOptions = new Menu("Nodes");
menuBar.getMenus().add(nodeOptions);
initDropdown();
BorderPane root = new BorderPane();
root.setTop(menuBar);
// Show the stage
primaryStage.setScene(new Scene(root));
primaryStage.setTitle("Sample");
primaryStage.show();
}
}