微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不在列表中的 ComboBox 值在 Java 11 中显示为空白

如何解决不在列表中的 ComboBox 值在 Java 11 中显示为空白

我正在将一个项目从 Java 8 迁移到 Java 11。当显示不在列表中的值时,ComboBox 的行为似乎发生了变化。

  • 在 Java 8 中,按下按钮时将显示“CHERRY”。
  • 在 Java 11 和 Java 14 中,Windows 和 RedHat 8.2 都是空白。

我一直在调试底层的皮肤代码,我找到了一些建议它应该工作的参考 在javafx.scene.control.skin.ComboBoxListViewSkin.updatedisplayNode()

// RT-21336 Show the ComboBox value even though it doesn't
// exist in the ComboBox items list (part two of fix)

是否有任何已知的解决方法

SSCCE

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ComboBoxIssue extends Application {

    public enum Fruit {
        APPLE,BANANA,CHERRY
    }

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        ComboBox<Fruit> fruits = new ComboBox<>();
        fruits.getItems().addAll(Fruit.APPLE,Fruit.BANANA);
        fruits.setValue(Fruit.APPLE);
        Button button = new Button("Change");
        button.setonAction(event -> {
            fruits.setValue(Fruit.CHERRY);
        });
        primaryStage.setScene(new Scene(new VBox(fruits,button)));
        primaryStage.show();
    }

}

解决方法

此问题已报告为 JDK-8221722 且尚未修复。重复问题存在解决方法:https://stackoverflow.com/a/55386928/898289

根本原因是javafx.scene.control.skin.ComboBoxListViewSkin.updateDisplayText(ListCell<T>,T,boolean)中的代码直接修改了控件的文本

String s = item == null && promptText != null ? promptText :
                   c == null ? (item == null ? null : item.toString()) : c.toString(item);
cell.setText(s);

但是单元格的项目(javafx.scene.control.Cell.item)仍然为空。

javafx.scene.control.Cell 中的 Java 8 和 11 之间添加的新代码在单元格更新后执行额外的布局传递,通过重写空项目使其变为空白,然后清除文本。

/** {@inheritDoc} */
@Override protected void layoutChildren() {
    if (itemDirty) {
        updateItem(getItem(),isEmpty());
        itemDirty = false;
    }
    super.layoutChildren();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。