Incidentally, I think this discussion may actually argue in favor of adopting a
"table column model" approach. Right now, the "columns" property is read only.
If we make it writable, you could simply provide a custom Sequence wrapper
around your bean Class<?>. It would also facilitate column model sharing. We
currently support that via the "columnSource" property, but maybe the model
approach would be better.
On Jan 4, 2011, at 2:45 PM, Greg Brown wrote:
>> > Since these class info is used to initialize the internal attributes and
>> > elements of TableView instance, if this class info was set after the
>> > generic class instance is created, we need to call some initialization
>> > method at the timing.
>>
>> Can you elaborate on your concern here?
>>
>> My concern is rather purity of implementation. If we don't call
>> setBeanType(cls), the created object don't have any specific GUI info since
>> it has no info to create it.
>
> It will still have a GUI - by default, TableView contains an empty column
> sequence, which is perfectly valid. Calling setColumns(Class<?>) would simply
> create a new (non-empty) sequence.
>
>> So the initialization must be taken place at the setter setBeanType(cls),
>> for instance it will be :
>>
>> void setBeanType(Class<?> cls) {
>> this.cls = cls;
>> initialize();
>> }
>>
>> void initialize() {
>> for (final Field field: cls.getFields()) {
>> final String fname = field.getName();
>> getColumns().add(new TableView.Column() {{
>> setName(fname);
>> setWidth(3, true);
>> ....
>> }
>
> Why not just put the initialize() code in the setter? Nothing else needs to
> call it.
>
>> If setter is invoked twice, i will initialize twice (although we can use
>> some flag to avoid this, but I think it is ugly)
>
> Why would the setter be invoked twice?
>
>> So conceptually, it is better to pass class object at the time of instance
>> creation.
>
> That isn't supported in BXML. Anything instantiated in BXML needs a default
> no-arg constructor - all properties are specified via setters.
>
> G
>
>