如何在选择框javafx中侦听所选事件

时间:2019-05-10 09:59:11

标签: javafx event-handling addeventlistener dropdownchoice

我正在使用SceneBuilder,我想出了3个选择框。第二个选择框取决于第一个选择框的输入,第三个选择框取决于第二个。我该如何实现?

我已经尝试过了

@FXML
private ChoiceBox  course;

course.getSelectionModel().selectedIndexProperty().addListener(
        (ObservableValue<? extends Number> ov,
             Number old_val, Number new_val) -> { 
                //some code here
            }
    );

但是此事件仅在我切换值时发生,第一个选择不会触发此事件,这不是我想要的。 我要如何实现这一点,谢谢。

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作,每次执行一项操作时,它都会设置下一个操作的值。记下.getItems().clear();,这将确保每次都清空列表,以使列表中没有旧值。但是,for循环并不重要,不仅在那里会为我添加的文本值添加一些变化

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        ChoiceBox<String> choiceBoxOne = new ChoiceBox<>();
        choiceBoxOne.setPrefWidth(100);
        choiceBoxOne.getItems().addAll("Choice1", "Choice2", "Choice3");

        ChoiceBox<String> choiceBoxTwo = new ChoiceBox<>();
        choiceBoxTwo.setPrefWidth(100);

        ChoiceBox<String> choiceBoxThree = new ChoiceBox<>();
        choiceBoxThree.setPrefWidth(100);

        choiceBoxOne.setOnAction(event -> {
            choiceBoxTwo.getItems().clear();
            //The above line is important otherwise everytime there is an action it will just keep adding more
            if(choiceBoxOne.getValue()!=null) {//This cannot be null but I added because idk what yours will look like
                for (int i = 3; i < 6; i++) {
                    choiceBoxTwo.getItems().add(choiceBoxOne.getValue() + i);
                }
            }
        });

        choiceBoxTwo.setOnAction(event -> {
            choiceBoxThree.getItems().clear();
            //The above line is important otherwise everytime there is an action it will just keep adding more
            if(choiceBoxTwo.getValue()!=null) {//This can be null if ChoiceBoxOne is changed
                for (int i = 6; i < 9; i++) {
                    choiceBoxThree.getItems().add(choiceBoxTwo.getValue() + i);
                }
            }
        });


        VBox vBox = new VBox();
        vBox.setPrefSize(300, 300);
        vBox.setAlignment(Pos.TOP_CENTER);
        vBox.getChildren().addAll(choiceBoxOne, choiceBoxTwo, choiceBoxThree);

        primaryStage.setScene(new Scene(vBox));
        primaryStage.show();
    }

    public static void main(String[] args) { launch(args); }
}