The JacpFX component lifecycle separates the tasks execution and state changes from each other. When a FXComponent receives a message, it first executes a handle method, which is running inside a worker thread.
In this stage you can execute any long running task or create new JavaFX nodes without blocking the application. When the task execution is finished, the subsequent postHandle method will be executed inside the FX Application thread.
@View(id = ComponentIds.COMPONENT__TWO,
name = "SimpleView",
active = true,
resourceBundleLocation = "bundles.languageBundle",
initialTargetLayoutId = PerspectiveIds.TARGET__CONTAINER_MAIN)
public class ComponentTwo implements FXComponent {
private GridPane rootPane;
@Override
public Node handle(final Message message) {
// runs in worker thread
...
return new GridPane();
}
@Override
public Node postHandle(final Node node,
final Message message) {
// runs in FX application thread
this.rootPane= node;
node.getChildren().add(new Label("xyz"));
return node
}
}
A JacpFX CallbackComponent has no UI, and therefore no need to switch to the FX Application thread. CallbackComponents can be used to outsource long running tasks, or to coordinate a message flow.
A JacpFX CallbackComponent can be either stateful or stateless.
@Component(id = ComponentIds.STATEFUL_CALLBACK, name = "statefulCallback", active = true, resourceBundleLocation = "bundles.languageBundle", localeID = "en_US")
public class StatefulCallback implements CallbackComponent {
private Logger log = Logger.getLogger(StatefulCallback.class.getName());
@Override
public Object handle(final Message message) {
log.info(message.getMessageBody().toString());
return "StatefulCallback - hello";
}
}
@Component(id = ComponentIds.STATELESS_CALLBACK, name = "statelessCallback", active = true, resourceBundleLocation = "bundles.languageBundle", localeID = "en_US")
@Stateless
public class StatelessCallback implements CallbackComponent {
private Logger log = Logger.getLogger(StatelessCallback.class.getName());
@Override
public Object handle(final Message message) {
log.info(message.getMessageBody().toString());
return "StatelessCallback - hello";
}
}