Extending builders

Richard Bair richard.bair at oracle.com
Thu Nov 29 15:29:05 PST 2012


Interesting, especially in the case of web view where location is not only synthetic, but actually exists on an object deeper down (getEngine())!

On Nov 29, 2012, at 3:18 PM, Daniel Fuchs <daniel.fuchs at oracle.com> wrote:

> On 11/29/12 11:28 PM, Richard Bair wrote:
>> I'm confused, don't we want scene builder / FXML to be able to use these new methods defined on builders as well? If they are used, then we have to use a builder instead of just configuring an object via reflection, or some such?
>> 
>> Richard
> Hi Richard,
> 
> SceneBuilder is able to deal with Builders methods if there is a corresponding getter on the object.
> If there is no getter on the object, then SceneBuilder can't figure out what the corresponding value should be - in which case there needs to be specific code in SB to take advantage of said methods.
> 
> A good example is the faked 'url' attribute for Image, or the fake 'location' attribute added to WebViewBuilder.
> In both cases - we had to add specific code in SB to handle these...
> 
> It's not because there's no value for an attribute in FXML that there's no value for that attribute on the object itself.
> 
> Let's say you have something like:
> 
> <fx:include source="MyWebView.fxml"/>
> 
> which happens to return a WebView... What value for the location attribute are you going to show in the Inspector? How is SceneBuilder going to figure out that this location attribute should be read-only, because it can only be supplied to the WebViewBuilder, and therefore <WebView location="some:url"/> is valid whereas <fx:include source="MyWebView.fxml" location="some:url"/> is not - because the object returned by fx:include is already built?
> Usually you will need to add specific code that knows about this - e.g - that knows that you can get the value of the
> location attribute by  calling WebView.getEngine().location()...
> 
> So even if the FXML loader is able to use these methods SceneBuilder might not - at least not out of the box...
> 
> -- daniel
> 
>> 
>> On Nov 28, 2012, at 7:27 AM, Eva Krejcirova<eva.krejcirova at oracle.com>  wrote:
>> 
>>> There will certainly be methods with one argument, so this means that there must be a way for SceneBuilder and FXML to tell these methods apart from the property methods.
>>> We can annotate the convenience methods by special annotation (e.g. BuilderConvenienceMethod).
>>> Or we could add an annotation (e.g. BuilderProperty) to the methods which correspond to properties (= the methods which are currently in the builders).
>>> 
>>> Eva
>>> 
>>> On 22.11.2012 16:01, Daniel Fuchs wrote:
>>>> On 11/22/12 3:40 PM, Eva Krejcirova wrote:
>>>>> Hi,
>>>>> 
>>>>> There is one more thing which needs to be sorted out before adding new
>>>>> methods to builders:
>>>>> SceneBuilder and FXML use builders to find names of properties of a
>>>>> class, so they need to have a way to differentiate between the new
>>>>> convenience methods and the methods which correspond to properties of a
>>>>> class. Daniel, is this still true?
>>>>> 
>>>>> Last time we discussed this, Daniel suggested to annotate these new
>>>>> convenience methods. If we go this way, we need to create a new runtime
>>>>> annotation (and find a name for it :-) )
>>>>> 
>>>>> Eva
>>>> Hi Eva,
>>>> 
>>>> Yes this is still true. Note that SceneBuilder actually uses
>>>> builders only in special cases - for WebView - for instance -
>>>> because of the fake location attribute available on WebViewBuilder
>>>> only - and for any type which has no public constructors (e.g.: all charts, Insets, etc...)
>>>> 
>>>> However - SceneBuilder discovers whether there are constructor properties by introspecting ClassX and ClassXBuilder and comparing
>>>> the results: it takes the name of all the single parameter
>>>> instance methods in ClassXBuilder which returns a builder,
>>>> remove the names of all writable (getter+setter) properties
>>>> found in ClassX, and what remain are assumed to be constructor properties.
>>>> 
>>>> As long as the convenience methods have more than 1 parameter
>>>> (varargs count for 1)  then this logic should remain valid.
>>>> 
>>>> The FXMLLoader's JavaFXBuilderFactory also introspects builders
>>>> in order to find out writable properties and type of properties,
>>>> so that's another place you will have to look at
>>>> (class JavaFXBuilderFactory.JavaFXBuilder).
>>>> 
>>>> best regards,
>>>> 
>>>> -- daniel
>>>> 
>>>> 
>>>> 
> 



More information about the openjfx-dev mailing list