Search code examples
javafxevent-handlingdropdowndropdownchoice

Javafx add a dropdown event listener for choicebox


I have a ChoiceBox and I want to refresh it's content whenever user expands it. I haven't found a proper listener for this. All the stuff google gives is related to handling ChangeValue events.

I reckon I should add eventListener<ActionEvent> to ChoiceBox since what I'm handling is click on a ChoiceBox, but my implementation doesn't work.

ActionEvent fires when I click on any List value, not when I click ChoiceBox itself.


Solution

  • Register a listener with the choice box's showingProperty:

    choiceBox.showingProperty().addListener((obs, wasShowing, isNowShowing) -> {
        if (isNowShowing) {
            // choice box popup is now displayed
        } else {
            // choice box popup is now hidden
        }
    });
    

    Here is a quick demo:

    import javafx.application.Application;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.ChoiceBox;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;
    
    public class ChoiceBoxPopupTest extends Application {
    
    
        private int nextValue ;
    
        @Override
        public void start(Stage primaryStage) {
            ChoiceBox<Integer> choiceBox = new ChoiceBox<>();
            choiceBox.getItems().add(nextValue);
            choiceBox.setValue(nextValue);
            choiceBox.showingProperty().addListener((obs, wasShowing, isNowShowing) -> {
                if (isNowShowing) {
                    choiceBox.getItems().setAll(++nextValue, ++nextValue, ++nextValue);
                }
            });
            BorderPane root = new BorderPane();
            root.setTop(choiceBox);
            BorderPane.setAlignment(choiceBox, Pos.CENTER);
            root.setPadding(new Insets(5));
            Scene scene = new Scene(root, 400, 400);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }