【问题标题】:changevalue listener spinner javafx更改值侦听器微调器 javafx
【发布时间】:2017-02-22 07:51:08
【问题描述】:

您好,我想刷新一个微调器中的每个键的标签。 我有以下代码:

spinner.valueProperty().addListener((obs, oldValue, newValue) -> {
        if (!"".equals(newValue)) {
            System.out.println("spiinerrrr");
        } 
    });

好的,当我单击微调器的箭头时,这段代码很好,但是当我单击微调器的输入字段并写一个数字时,

System.out.println("spiinerrrr");

不执行。

为什么?我没有找到组件微调器的更改值侦听器,而对于文本字段,当我在文本字段中编写时,以下代码很好:

textfield.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
        if (!"".equals(newValue)) {
            System.out.println("textfield");
        } 
    });

【问题讨论】:

  • 那么,您想在每次更改微调器值时刷新Label 的文本吗?
  • 是的,事实上,要替换System.out.println("spinner"),我有myLabel.setText(newValue),但是当我写在我的微调器中时,不工作,当我点击微调器箭头时工作。

标签: javafx


【解决方案1】:

你可以给Spinner的textProperty添加一个监听器:

spinner.getEditor().textProperty().addListener((obs, oldValue, newValue) -> {
        if (!"".equals(newValue)) {
            System.out.println("spiinerrrr");
        } 
    });

否则您必须在 valueProperty 更新之前按 Enter。

如果您想在焦点丢失时也更新valueProperty(无需按Enter),请向focusedProperty 添加一个额外的侦听器:

    spinner.focusedProperty().addListener((obs, oldValue, newValue) -> {
        if (newValue == false) {
            this.increment(0); 
        } 
    });

【讨论】:

    【解决方案2】:

    正如其他人所说,代码不会被执行,因为valueProperty 没有改变。

    您必须按 enter 才能在编辑器中应用文本并更改 valueProperty。

    来自doc of editableProperty:

    editable 属性用于指定用户输入是否能够 在 Spinner 编辑器中输入。如果 editable 为真,用户输入将 一旦用户键入并按下 Enter 键,就会收到。在这 点输入传递给 SpinnerValueFactory 转换器 StringConverter.fromString(String) 方法。返回值来自 这个调用(类型 T)然后被发送到 SpinnerValueFactory.setValue(Object) 方法。如果该值有效,则 将保留为值。如果无效,值工厂将 需要做出相应的反应并取消此更改。

    如果您需要一个 Spinner 来立即对其编辑器中的文本更改做出反应,您可以这样做:

    Spinner<Integer> spinner = new Spinner<>(0, 500, 0);
    spinner.setEditable(true);
    spinner.getEditor().textProperty().addListener((obs, oldval, newval) -> {
    
        SpinnerValueFactory<Integer> valueFactory = spinner.getValueFactory();
        if (valueFactory != null) {
            StringConverter<Integer> converter = valueFactory.getConverter();
            if (converter != null) {
                try {
                    Integer value = converter.fromString(newval);
                    if (value != null)
                        valueFactory.setValue(value);
                    else
                        valueFactory.setValue(0);
                } catch (NumberFormatException ex) {
                    spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
                }
            }
        }
    });
    

    注意:您的需求完全符合使用绑定而不是侦听器:

    label.textProperty().bind(spinner.valueProperty().asString());
    

    【讨论】:

      【解决方案3】:

      使用getEditor()方法访问spinner的TextField,然后添加监听:

      Spinner<String> sp = new Spinner<>(FXCollections.observableArrayList("aaa", "bbb", "ccc"));
      sp.setEditable(true);
      sp.getEditor().textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
          System.out.println(newValue);
      });
      

      如果您需要知道,当用户输入新值时:

      sp.getEditor().setOnAction(e -> {
          System.out.println(sp.getEditor().getText());
      }); 
      

      【讨论】:

        猜你喜欢
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 2020-05-12
        • 2019-06-04
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多