我最近开始使用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重写此代码。
答案 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();
}