javafx属性
自定义控件通常具有“只读”属性。 这意味着不能从控件外部进行设置,甚至不能从自己的皮肤类别进行设置。 通常,控件的行为会导致更改只读属性。 在JavaFX中,此行为可以在控件本身和皮肤中实现。 因此,有时我们最终希望通过皮肤来更新控件的只读属性。 如何才能做到这一点?
后门:物业地图
解决方案非常简单:将控件的属性映射用作控件类的后门。 属性映射是可观察到的,因此,如果外观在映射中设置一个值,则将通知控件,并且可以更新只读属性本身的值。
控制类
控件类中的属性可以这样定义:
private final ReadOnlyDoubleWrapper myReadOnly =new ReadOnlyDoubleWrapper();public final ReadOnlyDoubleProperty myReadOnlyProperty() {return myReadOnly.getReadOnlyProperty();
}public final Double getMyReadOnly() {return myReadOnly.get();
}
为了更新属性,控件类使用其自己的属性映射注册一个侦听器,并侦听对名为“ myReadOnly”的属性的更改:
getProperties().addListener(new MapChangeListener() {public void onChanged(Change c) {if (c.wasAdded() && "myReadOnly".equals(c.getKey())) {if (c.getValueAdded() instanceof Number) {myReadOnly.set((Double) c.getValueAdded());}getProperties().remove("myReadOnly");}}
});
重要提示:请确保对属性键使用唯一的名称,否则可能会导致命名冲突。 优良作法是在名称前加上控件的程序包名称,例如com.myframework.myReadOnly。
皮肤课
现在,外观类可以通过在控件的属性映射中设置属性值来更新属性:
getSkinnable().getProperties().put("myReadOnly", 42);
翻译自: https://www.javacodegeeks.com/2014/07/javafx-tip-11-updating-read-only-properties.html
javafx属性