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