Reentrent call to Control.createDefaultSkin()
Tom Schindl
tom.schindl at bestsolution.at
Fri Jun 24 08:38:41 UTC 2016
Hi,
I filed https://bugs.openjdk.java.net/browse/JDK-8160242
Tom
On 23.06.16 00:55, Jonathan Giles wrote:
> 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
>>
>
--
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