FXMLLoader templates

Tom Schindl tom.schindl at bestsolution.at
Tue Oct 1 00:18:41 PDT 2013

In case someone needs extra performance I can point you to my FXML =>
Java-Converter which will give you the best performance ;-)


On 01.10.13 09:15, Martin Sladecek wrote:
> After discussion with Richard, we decided to remove the template flag
> from FXMLLoader for 8.0.
> This API is not mature yet, due to the reasons described below and
> should be completely re-designed for some next release.
> This means that loading the same fxml multiple times will still require
> multiple FXMLLoader instances.
> Any comments?
> Thanks,
> -Martin
> On 09/20/2013 02:22 PM, Martin Sladecek wrote:
>> Hi,
>> I would like to discuss a 8.0 feature of FXMLLoader - the template flag.
>> I was introduced with this issue:
>> https://javafx-jira.kenai.com/browse/RT-23413, but unfortunately, it
>> never worked: https://javafx-jira.kenai.com/browse/RT-28121. I was
>> trying to fix the issue, but the whole concept of a flag for loading
>> templates seems hardly usable and incorrect to me and should be
>> replaced with something more appropriate.
>> The reason is the handling of root, controller and the namespace
>> before and after the load. Both are treated in 2 different ways.
>> Before the load, they are used to adjust the following load - by
>> setting the root (for <fx:root> tag), setting the namespace and a
>> controller.
>> However, after the load, these properties (though not FX-properties)
>> can be used to query what was just loaded. The root of the FXML, the
>> namespace with all "id"s and the controller.
>> Now that's not very useful when you want to use template loading. My
>> solution for RT-28121 (when keeping the old API) is to save the
>> namespace after setTemplate(true) was called, using this namespace on
>> each load(), clearing it at the begging of load() +  disallow
>> setController() for this mode.
>> But that doesn't cover all of the relevant use-cases I can think of.
>> Actually, without changing the API, I doubt we can support all such
>> use-cases.
>> Here's the set I'm working with:
>> 1) setup some "template namespace", n times do { adjust namespace
>> (based on template namespace) , load) }
>> 2) n times do {load, query id from namespace}
>> 3) n times do {setController(new Controller) load }
>> 4) n times do {load, query newly created controller}
>> 5,6) same as 3,4 but with root
>> So while in 1,3 we would need to clear namespace/controller after each
>> load, in 2,4 we need to clear it before each load. In case 3),
>> forgetting to set a new controller would otherwise result in 2
>> instances with the same controller.
>> One solution might be to split this to 2 independent calls.
>> setController/getLoadedController, ObservableMap getNamespace() and
>> Map getLoadedNamespace (unmodifiable).
>> Another might be a completely new class FXMLTemplate.
>> It might yield new pre-set FXMLLoaders that can be adjusted and
>> loaded, but it means generating a temporary object for each call.
>> Also, FXMLLoader would need to be updated, so that it's only possible
>> to call load() once.
>> Other ideas / use-cases?
>> Thanks,
>> -Martin

More information about the openjfx-dev mailing list