我最近开始使用 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/