Reentrent call to Control.createDefaultSkin()

Tom Schindl tom.schindl at bestsolution.at
Wed Jun 22 19:31:10 UTC 2016


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

-- 
Thomas Schindl, CTO
BestSolution.at EDV Systemhaus GmbH
Eduard-Bodem-Gasse 5-7, A-6020 Innsbruck
http://www.bestsolution.at/
Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck


More information about the openjfx-dev mailing list