如何解决不在列表中的 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 举报,一经查实,本站将立刻删除。