FX 19 中组合框焦点问题

Sai*_*dem 5 javafx javafx-19

升级到最新的 JavaFX 版本 (19) 后,我遇到了一些奇怪的问题。

如果我将最后一个选项设置为 ComboBox 中的值,那么在第一次打开时,如果我选择任何选项,下拉列表将不会隐藏。之后,下拉菜单将像往常一样工作。奇怪的是,只有当我将最后一个选项设置为值时才会发生这种情况。当我设置除最后一个选项之外的任何其他选项时,它运行良好。

在此输入图像描述

在上面的示例中,您可以注意到:

  • 如果设置“四”:即使我选择不同的选项(仅第一次),下拉列表也不会隐藏。
  • 如果设置为“三”:下拉菜单照常工作。

当我试图调查根本原因时,我几乎得出结论,这是因为新功能“focusWithIn”。因为这就是导致问题发生的地方。

但经过进一步调查,我还注意到焦点被搞乱了。在上面的 gif 中,您还可以注意到,如果我将最后一个选项设置为值,则“聚焦”样式不会应用于 ComboBox(同样只是第一次,直到我将焦点移到另一个节点,当我回来时,它会照常工作) )。而如果我设置不同的值,则聚焦样式效果会很好。

当我尝试将一些日志放在焦点属性上时,下面是我关注 ComboBox 时的输出(最后一个选项作为值):

ComboBox focused : true
ComboBox focused : false
Run Code Online (Sandbox Code Playgroud)

焦点立即关闭!

唯一让我困惑的是“为什么只有最后一个选项?? ”。我知道通常会出现问题/错误。但与最后一个选项的特殊关系,我无法理解:)

不管怎样,我尝试了不同的方法来使下拉隐藏和焦点起作用,但没有任何效果。你们有什么建议(解决方法)来解决这个问题吗?

下面是工作演示:

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"); // Change value to any other options, it works
        comboBox.focusedProperty().addListener((obs, old, focused) -> {
            System.out.println("ComboBox focused : " + focused+", showing: "+comboBox.isShowing());
            // ATTEMPT #2 : Requesting the focus by conditional checking (DIDN'T WORKED)
            if(comboBox.isShowing() && !focused){
                comboBox.requestFocus();
            }
        });

        // ATTEMPT #1 : Requesting the focus after the dropdown is shown (DIDN'T WORKED)
        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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ato*_*000 2

这绝对是 JavaFX 19 中的一个错误。我测试了很多东西,似乎为了在生成时设置 ComboBox 的初始选择,它需要两个勾选:

ComboBox<String> comboBox = new ComboBox<>();
comboBox.getItems().addAll("One", "Two", "Three", "Four");
initializeComboBox(comboBox, 3);
Run Code Online (Sandbox Code Playgroud)
private void initializeComboBox(ComboBox comboBox, int intialIndex) {
    Platform.runLater(()->{
        Platform.runLater(()->{
            comboBox.getSelectionModel().select(intialIndex);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

我无法回答为什么仅最后一项需要它。这将是开发人员的工作。但是,这将同时作为此版本中此特定用例的解决方法。

  • 仅供参考:JDK-8297130 在 fx20 中被标记为已修复 (2认同)