Reentrent call to Control.createDefaultSkin()
Jonathan Giles
jonathan.giles at oracle.com
Wed Jun 22 22:55:28 UTC 2016
I think this is a reasonable expectation. Can you please file an issue
and we can progress it from there?
Thanks,
-- Jonathan
On 23/06/16 7:31 AM, Tom Schindl wrote:
> Hi,
>
> Take a look at the stack below.
>
>> ComboBoxListViewSkin<T>(ComboBoxBaseSkin<T>).<init>(ComboBoxBase<T>, ComboBoxBaseBehavior<T>) line: 57
>> ComboBoxListViewSkin<T>(ComboBoxPopupControl<T>).<init>(ComboBoxBase<T>, ComboBoxBaseBehavior<T>) line: 61
>> ComboBoxListViewSkin<T>.<init>(ComboBox<T>) line: 113
>> ComboBox<T>.createDefaultSkin() line: 420
>> ComboBox<T>(Control).impl_processCSS(WritableValue<Boolean>) line: 859
>> FSimpleSelectControl<T>(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> FSimpleSelectControl<T>(Control).impl_processCSS(WritableValue<Boolean>) line: 855
>> FlexibleGridLayoutPane$LayoutItem(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> GridPane(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> FlexibleGridLayoutPane(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> VBox(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> ScrollPaneSkin$4(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> ScrollPaneSkin$3(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> ScrollPane(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> ScrollPane(Control).impl_processCSS(WritableValue<Boolean>) line: 855
>> ScrollPane(Node).processCSS() line: 9056
>> SimpleListCell<T>(Node).applyCss() line: 9153
>> ComboBoxListViewSkin<T>(ComboBoxBaseSkin<T>).updateDisplayArea() line: 150
>> ComboBoxListViewSkin<T>.updateButtonCell() line: 406 [local variables unavailable]
>> ComboBoxListViewSkin<T>.<init>(ComboBox<T>) line: 134
>> ComboBox<T>.createDefaultSkin() line: 420
>> ComboBox<T>(Control).impl_processCSS(WritableValue<Boolean>) line: 859
>> FSimpleSelectControl<T>(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> FSimpleSelectControl<T>(Control).impl_processCSS(WritableValue<Boolean>) line: 862
>> FlexibleGridLayoutPane$LayoutItem(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> GridPane(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> FlexibleGridLayoutPane(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
>> VBox(Parent).impl_processCSS(WritableValue<Boolean>) line: 1280
> It shows you a stack where I create an instance of a ComboBox but this
> code creates 2 Skin-Instance for the same ComboBox-Instance (the 2nd
> iteration starts with updateDisplayArea).
>
> I've been unable to come up with a stripped down example but I think
> Control#impl_processCSS(WritableValue<Boolean>) has to ensure that no
> 2nd skin is created while the first initialization is not finished.
>
> Something like that:
>
> private boolean createSkinCreationInProgress;
>
> @Override protected void impl_processCSS(WritableValue<Boolean> unused) {
>> super.impl_processCSS(unused);
>>
>> if (getSkin() == null) {
>> if( createSkinCreationInProgress ) {
>> return;
>> }
>> try {
>> createSkinCreationInProgress = true;
>> // try to create default skin
>> final Skin<?> defaultSkin = createDefaultSkin();
>> if (defaultSkin != null) {
>> skinProperty().set(defaultSkin);
>> super.impl_processCSS(unused);
>> } else {
>> final String msg = "The -fx-skin property has not been defined in CSS for " + this +
>> " and createDefaultSkin() returned null.";
>> final List<CssError> errors = StyleManager.getErrors();
>> if (errors != null) {
>> CssError error = new CssError(msg);
>> errors.add(error); // RT-19884
>> }
>> Logging.getControlsLogger().severe(msg);
>> }
>> } finally { createSkinCreationInProgress = false; }
>> }
> }
>
> Does that make sense?
>
> Tom
>
More information about the openjfx-dev
mailing list