java - JavaFX 中的 registerChangeListener 方法有什么作用?

标签 java javafx javafx-11

我最近开始使用 JavaFX。我在项目中将JDK从8更改为11,并且有一个类使用此方法:

public class LabeledColorPickerSkin extends ColorPickerSkin {
    public LabeledColorPickerSkin(final LabeledColorPicker colorPicker) {
        super(colorPicker);
        registerChangeListener(colorPicker.valueProperty(), "VALUE");
        text.setText(colorPicker.text);
        updateColor();
     }
}

这里使用的是:

import javafx.scene.control.ColorPicker;
import javafx.scene.control.Skin;

public class LabeledColorPicker extends ColorPicker {
    public LabeledColorPicker()
    {
        super();
        getStyleClass().addAll("labeled-color-picker",
                "text-visible");
    }
    /** {@inheritDoc} */
    @Override protected Skin<?> createDefaultSkin() {
        return new LabeledColorPickerSkin(this);
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    String text;
}

在版本 8 中,该方法如下所示:

protected final void registerChangeListener(ObservableValue<?> property, String reference) {
    if (changeListenerHandler == null) {
        changeListenerHandler = new MultiplePropertyChangeListenerHandler(p -> {
            handleControlPropertyChanged(p);
            return null;
        });
    }
    changeListenerHandler.registerChangeListener(property, reference);
}

现在看起来像这样:

protected final void registerChangeListener(ObservableValue<?> property, Consumer<ObservableValue<?>> consumer) {
    if (lambdaChangeListenerHandler == null) {
        lambdaChangeListenerHandler = new LambdaMultiplePropertyChangeListenerHandler();
    }
    lambdaChangeListenerHandler.registerChangeListener(property, consumer);
}

我不明白这个方法的作用以及如何为 JavaFX 11 重写此代码。

最佳答案

此方法用于将监听器注册到控件的属性。除了确保 WeakChangeListener 之外,它还确保仅使用一个监听器来实现此目的。如果您更换皮肤,则用于允许垃圾收集。

在 JavaFX 8 中,包含类 SkinBase (以及像 ColorPickerSkin 这样的子类)是内部 API 的一部分并使用 String收到属性更改通知(哎呀)。当属性更改时,handleControlPropertyChanged调用方法接收,并将字符串作为第二个参数传递给 registerChangeListener方法作为参数。

以下代码来自 ColorPickerSkin 的源码,但您正在使用的代码应该包含类似的内容:

@Override protected void handleControlPropertyChanged(String p) {
    super.handleControlPropertyChanged(p);

    if ("SHOWING".equals(p)) {
        ...
    } else if ("VALUE".equals(p)) {
        /* Some logic for updating the GUI */
    }
}

要重写新 (JavaFX 9+) API 的代码,您需要移动执行的逻辑,如果 "VALUE"作为参数传递给该方法,从此方法到 Consumer<ObservableValue<?>> :

public LabeledColorPickerSkin(final LabeledColorPicker colorPicker) {
    super(colorPicker);
    registerChangeListener(colorPicker.valueProperty(), observable -> {
        /* Some logic for updating the GUI */
    });
    text.setText(colorPicker.text);
    updateColor();
}

关于java - JavaFX 中的 registerChangeListener 方法有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57609458/

相关文章:

java - 如何在单击时更改按钮背景

java - 如何在 Eclipse 中使用 JavaFX 11?

java - 忽略所有属性但列出的属性的 Jackson 字段注释

java - 在 Objectify 中保留类文字

java - 节点移动 - JavaFX

JavaFX ScrollPane 不填充它的父 Pane

java - 对于 3d 星空(在 JavaFX 中),使标签与观察者的视角保持一致

java - 重命名文件失败

java - 在版本控制下的 Eclipse 项目中创建一个新的根目录

java - 为什么 JavaFx 应用程序必须从其自己的类中启动?