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();
}
}
答案 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。