如何以编程方式选择项目时触发ComboBox EventHandler?

时间:2015-06-19 19:44:59

标签: java javafx

ComboBox控件有一个名为setOnAction的方法。此方法接受一个EventHandler,该文档按文档中所述进行调用:

  

ComboBox操作,每当ComboBox值调用时   财产改变了。这可能是由于价值属性所致   当用户选择弹出窗口中的项目时,以编程方式更改   列表或对话框,或者,在可编辑的ComboBoxes的情况下,它可能是何时   用户提供自己的输入(通过TextField或一些   其他输入机制。

当Stage首次加载时,我不希望ComboBox默认为空值,我希望它自动选择ComboBox中的第一个选项(如果有的话)。 getSelectionModel()selectFirst()方法确实更改了ComboBox的选择,但由于某种原因它不会触发EventHandler。但是,调用完全相同的方法的按钮的EventHandler将导致EventHandler触发。我做错了什么?

这是一个使用JDK 8u40显示此行为的简短测试用例:

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;

public class Test extends Application {

    public void start(Stage stage) throws Exception {
        HBox pane = new HBox();
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.getItems().add("Hello");
        comboBox.getItems().add("World");
        comboBox.setOnAction((e) -> {
             System.out.println(comboBox.getSelectionModel().getSelectedItem());
        });
        Button button = new Button("Select First");
        button.setOnAction((e) -> {
            comboBox.getSelectionModel().selectFirst();
        });

        comboBox.getSelectionModel().selectFirst();

        pane.getChildren().add(comboBox);
        pane.getChildren().add(button);
        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }
}

1 个答案:

答案 0 :(得分:5)

我不完全理解为什么这是必要的,但是为了让传递给setOnAction()方法的EventHandler触发ComboBox控件,必须首先使用show()方法显示舞台。

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;

public class Test extends Application {

    public void start(Stage stage) throws Exception {
        HBox pane = new HBox();
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.getItems().add("Hello");
        comboBox.getItems().add("World");
        comboBox.setOnAction((e) -> {
             System.out.println(comboBox.getSelectionModel().getSelectedItem());
        });
        Button button = new Button("Select First");
        button.setOnAction((e) -> {
            comboBox.getSelectionModel().selectFirst();
            System.out.println("The button did it!");
        });

        button.fire();

        pane.getChildren().add(comboBox);
        pane.getChildren().add(button);
        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();

        comboBox.getSelectionModel().selectFirst();
    }
}

对于所有控件而言,这似乎并非完全正确。在上面的示例中,调用按钮上的fire()方法将在显示阶段之前触发EventHandler。