You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX 19 ComboBox焦点异常:选中最后一项时下拉框无法隐藏

JavaFX 19 ComboBox默认选中最后一项时下拉框无法正常隐藏的问题解决

问题概况

升级至JavaFX 19后出现以下异常:

  • 当ComboBox默认选中最后一个选项时,首次打开下拉框并选择任意选项,下拉框不会自动隐藏;后续操作恢复正常
  • 默认选中其他选项时无此问题
  • 伴随焦点异常:首次聚焦该ComboBox时,focused状态瞬间切换,焦点立即丢失,日志输出:
ComboBox focused : true
ComboBox focused : false

初步推测问题与JavaFX 19新增的focusWithin特性有关。

可复现代码

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ComboBoxDemo extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.getItems().addAll("One", "Two", "Three", "Four");
        comboBox.getSelectionModel().select("Four"); // 切换为其他选项则正常
        comboBox.focusedProperty().addListener((obs, old, focused) -> {
            System.out.println("ComboBox focused : " + focused+", showing: "+comboBox.isShowing());
            // 尝试方案2:条件判断请求焦点(无效)
            if(comboBox.isShowing() && !focused){
                comboBox.requestFocus();
            }
        });

        // 尝试方案1:下拉框显示后请求焦点(无效)
        comboBox.setOnShown(e -> {
            System.out.println("ComboBox shown...");
            comboBox.requestFocus();
        });

        VBox root = new VBox(new CheckBox("Just for focus grabbing"), comboBox);
        root.setAlignment(Pos.CENTER);
        root.setSpacing(20);
        
        Scene scene = new Scene(root, 300, 200);
        primaryStage.setTitle("ComboBox FX " + System.getProperty("javafx.runtime.version"));
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

可行修复方案

方案1:延迟初始化选中项+稳定焦点

通过在窗口显示后再设置选中项,并利用Platform.runLater延迟请求焦点,避开初始化阶段的焦点竞争问题,确保ComboBox能稳定持有焦点以触发正常的下拉框隐藏逻辑:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ComboBoxDemo extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.getItems().addAll("One", "Two", "Three", "Four");

        // 窗口显示完成后再设置选中项,避免初始化时的焦点冲突
        primaryStage.setOnShown(e -> {
            comboBox.getSelectionModel().select("Four");
        });

        // 下拉框显示时延迟请求焦点,确保焦点稳定在ComboBox上
        comboBox.showingProperty().addListener((obs, oldVal, newVal) -> {
            if (newVal) {
                Platform.runLater(comboBox::requestFocus);
            }
        });

        comboBox.focusedProperty().addListener((obs, old, focused) -> {
            System.out.println("ComboBox focused : " + focused+", showing: "+comboBox.isShowing());
        });

        VBox root = new VBox(new CheckBox("Just for focus grabbing"), comboBox);
        root.setAlignment(Pos.CENTER);
        root.setSpacing(20);
        
        Scene scene = new Scene(root, 300, 200);
        primaryStage.setTitle("ComboBox FX " + System.getProperty("javafx.runtime.version"));
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

方案2:升级JavaFX版本

该问题属于JavaFX 19的版本bug,后续版本(如JavaFX 20及以上)已修复此焦点异常问题,直接升级至最新稳定版可彻底解决。

内容的提问来源于stack exchange,提问作者Sai Dandem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:10:28