Как можно адаптировать классы с полями стандартных Java-типов к JavaFX?
Пример модели (сущности) с такими полями класса, которые удобны для JavaFX-контроллера:
package dev.example.model.entities;
import javafx.beans.property.*;
public class Person {
private final IntegerProperty id;
private final StringProperty familyName;
private final StringProperty givenName;
}
Согласно книге "Чистая архитектура", сущности не должны зависеть ни от какого фреймворка. Это значит, что поля класса должны иметь стандартные для Java-типы:
public class Person {
private final int id;
private final String familyName;
private final String givenName;
}
Но как можно адаптировать этот класс к JavaFX без потери возможности использовать функционал JavaFX? Пока не придумал ничего интереснее, чем явное присвоение полей одного класса полям другого класса:
public class Person {
private final int id;
private final String familyName;
private final String givenName;
}
public class PersonForJavaFX {
public PersonForJavaFX(Person person) {
this.id = new IntegerProperty(person.id);
this.familyName = new StringProperty(person.familyName);
this.givenName = new StringProperty(person.givenName);
}
}
Если полей мало - сойдёт, а если их сотня-другая?
Будучи новичком в JavaFX на момент написания этого вопроса, а не понимаю, зачем нужны IntegerProperty и StringProperty - в учебнике лишь сказано без объяснений:
В JavaFX для всех полей класса-модели предпочтительно использовать Properties (Источник)
Ответы (1 шт):
- Properties JavaFX использовать лучше, так как они могут автоматически обновлять пользовательский интерфейс при изменении. Вот пример кода,Выводящего в консоль сообщение при изменении значения Property:
yourProperty.addListener(new ChangeListener(){
@Override public void changed(ObservableValue o,Object oldVal,
Object newVal){
System.out.println("Property has changed!");
}
});
yourProperty.setValue("new value"); Вызывается метод changed//
Подробная информация об использовании Properties
- Для автоматической генерации JavaFX Properties по предоставленному объекту сущности вы можете использовать JavaBeanObjectPropertyBuilder. Вот пример метода, позволяющего получить JavaBeanObjectProperty из объекта сущности класса T:
private <T> JavaBeanProperty<T> generateBean(String name) {
try {
return JavaBeanObjectPropertyBuilder.create().bean(this).name(name).build();
} catch (Exception e) {
ImageJFX.getLogger().log(Level.SEVERE, null, e);
}
return null;
}