javaFX中的“ registerChangeListener”方法有什么作用

时间:2019-08-22 12:34:26

标签: 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重写此代码。

1 个答案:

答案 0 :(得分:1)

此方法用于将侦听器注册到控件的属性。除了确保使用WeakChangeListener允许皮肤被垃圾回收(如果您更换皮肤)之外,它还确保仅为此目的使用一个侦听器。

在JavaFX 8中,包含的类SkinBase(以及子类ColorPickerSkin)是内部API的一部分,并使用String来通知属性更改(yike) 。更改属性后,称为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();
}