JavaFX Menu soll nicht bei jedem Click verschwinden

Der_AltMann

Aktives Mitglied
Ich habe in Javafx ein menu, indem sich mehrere CheckMenuItems befinden. Ich hätte es gerne, dass bei einem click auf das CheckMenuItem sich das Menü nicht einklappt. Ist das irgendwie möglich?
 
Vielleicht in der EventHandler-Methode nochmal die show-Methode aufrufen? Jedenfalls würde ich aus dem Stand erstmal so etwas versuchen.

Edit: Was willst du denn erreichen?
 
Vielleicht in der EventHandler-Methode nochmal die show-Methode aufrufen? Jedenfalls würde ich aus dem Stand erstmal so etwas versuchen.

Edit: Was willst du denn erreichen?
hab das versucht aber hat nicht so gut geklappt:
Java:
checkMenuItem.selectedProperty().addListener((observableValue, oldValue, newValue) -> {
                checkMenuItem.getParentMenu().show();
//noch bisschen code
}

ich möchte, dass man mehrere Items in dem Menü auswählen kann und dann mit einem MenuItem "apply" werden alle ausgewählten Items gesammelt und damit eine Funktion ausgeführt. Es ist natürlich nervig wenn man 3 Items auswählen will und dazu 3 mal das Menü öffnen muss
 
Ich habe noch nicht den genauen Überblick. Du hast CheckMenuItem Elemente und wenn der Anwender da drauf klickt, soll das Menu offen bleiben?

Dann wäre evtl. dies die Lösung:
Dort wird dann eine CustomMenuItem mit einer Checkbox erstellt und auf dem CustomMenuItem wird setHideOnClick(false) aufgerufen.
 
Ich habe noch nicht den genauen Überblick. Du hast CheckMenuItem Elemente und wenn der Anwender da drauf klickt, soll das Menu offen bleiben?

Dann wäre evtl. dies die Lösung:
Dort wird dann eine CustomMenuItem mit einer Checkbox erstellt und auf dem CustomMenuItem wird setHideOnClick(false) aufgerufen.
vielen dank das funktioniert 👍
allerdings wird bei mir der Text in der Checkbox nur angezeigt, wenn ich mit der Maus drüber fahre.
kann man das irgendwie ändern?
Unbenannt.png
 
Kannst Du mir evtl. Deinen Code etwas zeigen? Dieses Verhalten sehe ich bei mir nicht. Eine Fehlersuche ist recht schwer, wenn man den Fehler nicht nachvollziehen kann.
 
Kannst Du mir evtl. Deinen Code etwas zeigen? Dieses Verhalten sehe ich bei mir nicht. Eine Fehlersuche ist recht schwer, wenn man den Fehler nicht nachvollziehen kann.
klar

Java:
List<CustomMenuItem> items;
    private void initDropdown() {

        ArrayList<String> slaves = ldfParser.getNodes().getSlaves();
        if (items == null) {
            items = new ArrayList<>();
            for (String slave : slaves) {
                CheckBox box = new CheckBox(slave);
                CustomMenuItem menuItem = new CustomMenuItem(box);
                menuItem.setHideOnClick(false);
                items.add(menuItem);
            }
        }
        nodeOptions.getItems().clear();
        nodeOptions.getItems().addAll(items);

        MenuItem applyButton = new MenuItem("apply");
        applyButton.setStyle("-fx-background-color:green");
        nodeOptions.getItems().add(applyButton);
        applyButton.setOnAction(e -> {
            sensorcontroller.communicationStopped(null);
            setupLin.restartLin(selectedSlaves);
            try {
                viewSensorValues(null);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            
        });
        // if a new value is selected in the dropdown menu it is added to an arraylist
        for (CustomMenuItem customItem : items) {
            CheckBox box = (CheckBox) customItem.getContent();
            
            box.selectedProperty().addListener((observableValue, oldValue, newValue) -> {
            
                if (newValue) {

                    boolean found = false;
                    for (String string : selectedSlaves) {
                        if (string.contentEquals(box.getText())) { // it is already in the list
                            found = true;
                        }
                    }
                    if (!found) {
                        selectedSlaves.add(box.getText());
                        appendText(selectedSlaves.toString());
                        appendText("bin in der newvalue");
                    }

                } else {
                    selectedSlaves.remove(box.getText());
                    appendText(selectedSlaves.toString());
                    appendText("bin in der else");
                }
            });
        }

    }
 
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:
Java:
box.setTextFill(Paint.valueOf("#000000"));

Ein kleines Testprogramm, in das ich etwas Deinen Code integriert habe:
[CODE lang="java" highlight="21"]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();
}
}[/CODE]
 
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:
Java:
box.setTextFill(Paint.valueOf("#000000"));

Ein kleines Testprogramm, in das ich etwas Deinen Code integriert habe:
[CODE lang="java" highlight="21"]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();
}
}[/CODE]
perfekt vielen Dank, funktioniert wunderbar😘
 

Neue Themen


Zurück
Oben