我有一个现有的类,我想对javafx不了解。是否有一种公认的装饰或改编方式,使其支持javafx属性?
我想做类似以下的事情(这显然是错误的):
public class FooWrapper {
/**
* Decorates a Foo instance with javafx stuff
*/
private final Foo foo;
public FooWrapper(Foo toWrap) {
this.foo = toWrap;
}
private final StringProperty name = new SimpleStringProperty();
public final StringProperty nameProperty() {
return this.foo.getName();//?????
}
public final String getName() {
return this.nameProperty().get();
}
public final void setFirstName(final String name) {
this.nameProperty().set(name);
}
}
public class Foo {
/**
* Basic class I want to keep ignorant of javafx
*/
private String name = "hello";
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
答案 0 :(得分:3)
使用javafx.beans.property.adapter
包中的类。
public class Foo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class FooAdapter {
private final JavaBeanStringProperty name;
public FooAdapter(Foo foo) {
try {
name = JavaBeanStringPropertyBuilder.create().bean(foo).name("name").build();
} catch (NoSuchMethodException ex) {
throw new RuntimeException(ex);
}
}
public final void setName(String name) {
this.name.set(name);
}
public final String getName() {
return name.get();
}
public final StringProperty nameProperty() {
return name;
}
}
如上所述,适配器属性要求基础对象遵循Java Bean约定的属性。但是,有一些方法可以定制将哪些方法用于吸气剂/设置剂。
adapter属性将从底层对象获取值,并且如果可写,则在更新时也会写入底层对象。如果它支持PropertyChangeListener
,它也可以观察基础对象的更改。请注意,此功能是使用反射实现的;如果您使用的是模块,则需要向exports
中添加适当的opens
/ module-info
指令(有关详细信息,请参见各种属性的Javadoc,例如JavaBeanStringProperty
)