【问题标题】:JavaFx: How can I get the combobox object from it's textfield?JavaFx:如何从它的文本字段中获取组合框对象?
【发布时间】:2020-05-12 18:40:35
【问题描述】:

我有一个组合框 (cb)。当有人点击相关的文本字段时,我想清除它。我用

cb.getEditor().setOnMousePressed(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent evt) {
        ((TextField) evt.getSource()).clear();
    }
});

结果在 cb.getEditor().getText() 到目前为止一切顺利。
如果我通过下拉而不是键入来填充框,则结果在cb.getSelectionModel().getSelectedIndex();
那也很好。组合框填充了一个对象,而不是一个字符串,所以我不能真正使用 getSelectedItem()。我希望我能。
问题是,如果我尝试从下拉列表中选择某些内容,然后使用编辑器,则 selectedIndex() 保持设置。
当我有文本字段的鼠标事件时,如何清除组合框 selectedIndex?我找不到从文本字段中获取组合框的方法。
我不知道它是否相关,但我也通过TextFields.bindAutoCompletion(cb.getEditor(), cb.getItems())); 将文本与框联系起来

【问题讨论】:

  • "组合框填充的是对象,而不是字符串,所以我不能真正使用getSelectedItem()。" 为什么不呢?
  • 奇怪的是,NetBeans 不允许我这样做。如果我尝试,cb.getSelectionModel().getSelectedItem().getSomeObjectProperty() 它会编译,但在运行时我会得到“不是 Java.Lang.String 的属性”
  • 如果 NetBeans 不允许您运行它,您将如何运行它?您是否在组合框上设置了转换器?
  • 这很奇怪。我正在 NB 中编译/运行,但是虽然我可以编译,但当我运行它并查看 selectedItem() 时,它说它是一个字符串。我做不到 (MyObject) (...getSelectedItem()) ;它说我无法将字符串转换为对象。
  • 你设置转换器了吗?文档明确指出,如果组合框是可编辑的并且其类型不是String,则必须设置转换器。 "默认情况下,转换器仅在用户键入时返回 String 输入,因此假定可编辑 ComboBox 的类型是 String。如果指定了不同的类型并且 ComboBox 是可编辑的,则有必要指定一个自定义 StringConverter。”

标签: javafx combobox textfield


【解决方案1】:

来自ComboBox documentation

因为ComboBox 是可以编辑的,并且默认方式允许 用户输入是通过TextField,提供了字符串converter 属性 允许开发人员指定如何翻译用户字符串 到 T 类型的对象中,以便 value 属性可以包含它。 默认情况下,converter 仅以用户身份返回 String 输入 键入它,因此假定可编辑的类型 ComboBoxString。如果指定了不同的类型并且 ComboBox 是可编辑的,必须指定一个自定义 StringConverter.

(我的重点)。

因此,您需要为您的ComboBox 提供一个转换器,该转换器定义如何将用户在组合框编辑器中键入的字符串转换为正确类型的对象,以及相反如何将该类型的对象转换为要在文本字段中显示的字符串。

完成此操作后,从组合框中检索值的正确方法是使用

cb.getValue();

【讨论】:

  • 我只是一个鸡蛋。我不知道 StringConverter。我做了一些研究并为我的 cb 设置了它,但我仍然有一个问题 ~ 如果有人在文本框中输入乱码,它仍然会返回最新的选择。那是我最初的问题!
  • @Megabuttons 您的转换器需要以某种合理的方式处理“乱码”。
  • 感谢您的提示。我没有看到的是一种无需再次遍历我的源列表即可识别废话的方法。不过我很乐意尝试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2013-09-05
相关资源
最近更新 更多