FXML initialize方法中ComboBox选中值后弹窗无法关闭的问题
JavaFX ComboBox初始化时选中值后弹出面板无法隐藏的异常
问题现象
在带有@FXML注解的initialize方法中直接设置ComboBox的选中值时,控件的下拉弹出面板不会自动隐藏,具体表现如下:
示例代码
Main类
public class Main extends Application { @Override public void start(Stage stage) throws Exception { Button test = new Button("Test"); test.setOnAction(event -> { TestDialog dialog = new TestDialog(stage); dialog.show(); }); HBox hBox = new HBox(test); stage.setScene(new Scene(hBox, 300, 50)); stage.show(); } public static void main(String[] args) { launch(args); } }
TestDialog类
public class TestDialog extends Dialog<ButtonType> { @FXML private ComboBox<Integer> baudRateComboBox; public TestDialog(Window owner) { try { FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource("/com/sample/dialogpane.fxml")); loader.setController(this); initOwner(owner); initModality(Modality.APPLICATION_MODAL); setDialogPane(loader.load()); } catch (IOException e) { throw new RuntimeException(e); } } @FXML private void initialize() { baudRateComboBox.getItems().setAll(4800, 9600, 19200, 38400, 57600, 115200); baudRateComboBox.getSelectionModel().select((Integer) 115200); } }
FXML文件
<DialogPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml"> <content> <HBox spacing="5" alignment="BASELINE_LEFT"> <Label text="Baudrate:"/> <ComboBox fx:id="baudRateComboBox"/> </HBox> </content> <buttonTypes> <ButtonType text="Затвори" buttonData="CANCEL_CLOSE"/> </buttonTypes> </DialogPane>
解决方案
将设置选中值的操作放入Platform.runLater中异步执行,即可解决弹出面板无法隐藏的问题:
@FXML private void initialize() { baudRateComboBox.getItems().setAll(4800, 9600, 19200, 38400, 57600, 115200); Platform.runLater(() -> baudRateComboBox.getSelectionModel().select((Integer) 115200)); }
环境信息
- 系统:Ubuntu
- JDK版本:18.0.1.1
- JavaFX版本:19
内容的提问来源于stack exchange,提问作者mr mcwolf
相关产品推荐
相关产品推荐

