I found a better way to implement that feature so I stopped caring :-)

Scott

On 2013-09-26, at 4:01 PM, Richard Bair <richard.b...@oracle.com> wrote:

> Hi Scott,
>
> Did this ever get answered? Is the issue reproducible on the latest 8 builds?
>
> Thanks
> Richard
>
> On May 8, 2013, at 7:10 AM, Scott Palmer <swpal...@gmail.com> wrote:
>
>> JavaFX 2.2.21-b11
>> I have a TextField where I have set the skin to the following:
>>
>>   private static class MyEditorSkin extends TextFieldSkin {
>>
>>       public MyEditorSkin (TextField tf) {
>>           super(tf);
>>       }
>>
>>       public MyEditorSkin (TextField tf, TextFieldBehavior tfb) {
>>           super(tf, tfb);
>>       }
>>
>>       public FontMetrics getFontMetrics() {
>>           return fontMetrics.getValue();
>>       }
>>   }
>>
>> e.g. myTextField.setSkin(new MyEditorSkin(myTextField));
>>
>> Elsewhere in my code I do:
>>       Skin<?> skin = tf.getSkin();
>>       if (skin instanceof MyEditorSkin) {
>>           FontMetrics fm = ((MyEditorSkin) skin).getFontMetrics();
>>           ...
>>
>> This was the only way I could see to get at the Font metrics used in a
>> TextField.  (I need to position some popups near the caret and using the
>> public methods to get the caret position in characters combined with
>> finding the width of the preceding characters seemed to be the simplest
>> way.)
>>
>> Anyway.. my code has been working fine, but I just got a new style-sheet
>> from our graphic designer and when I use the new CSS suddenly the TextField
>> is throwing the following exception and I can't move the caret with the
>> cursor keys or type properly in it.
>>
>> Exception in thread "JavaFX Application Thread"
>> java.lang.NullPointerException
>>       at
>> com.sun.javafx.scene.control.skin.TextInputControlSkin.setCaretAnimating(TextInputControlSkin.java:585)
>>       at
>> com.sun.javafx.scene.control.behavior.TextFieldBehavior.setCaretAnimating(TextFieldBehavior.java:164)
>>       at
>> com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(TextInputControlBehavior.java:124)
>>       at
>> com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(BehaviorBase.java:157)
>>       at
>> com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callActionForEvent(TextInputControlBehavior.java:117)
>>       at
>> com.sun.javafx.scene.control.behavior.BehaviorBase$1.handle(BehaviorBase.java:121)
>>       at
>> com.sun.javafx.scene.control.behavior.BehaviorBase$1.handle(BehaviorBase.java:119)
>>       at
>> com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
>>       at
>> com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
>>       at
>> com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
>>       at
>> com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
>>       at
>> com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
>>       at
>> com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
>>       at
>> com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
>>       at
>> com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
>>       at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
>>       at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
>>       at javafx.event.Event.fireEvent(Event.java:171)
>>       at javafx.scene.Scene$KeyHandler.process(Scene.java:3513)
>>       at javafx.scene.Scene$KeyHandler.access$2300(Scene.java:3472)
>>       at javafx.scene.Scene.impl_processKeyEvent(Scene.java:1904)
>>       at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2270)
>>       ...
>> Also happens on focus gained.
>>
>> Looking at that line of source it seems that the only thing that could be
>> null is the caretTimeline.  But the caret is blinking away happily.  I
>> search the code and it seems the only way the caretTimeline can become null
>> is if dispose() is called on the TextInputControlSkin.  I don't understand
>> when this would happen or how different CSS that does little more than set
>> colours and backgrounds and borders would affect it.
>>
>> I'm not sure if I'm doing something wrong or if this warrants a bug report.
>>
>> In JavaFX 8.0.0-ea-b87  it is worse.. I can't even show the Scene with my
>> control without getting the following:
>>
>> Exception in thread "JavaFX Application Thread"
>> java.lang.NullPointerException
>>       at com.sun.javafx.css.StyleCacheEntry.put(StyleCacheEntry.java:82)
>>       at
>> javafx.scene.CssStyleHelper.transitionToState(CssStyleHelper.java:784)
>>       at javafx.scene.Node.impl_processCSS(Node.java:8541)
>>       at javafx.scene.Parent.impl_processCSS(Parent.java:1191)
>>       at javafx.scene.Parent.impl_processCSS(Parent.java:1191)
>>       at javafx.scene.control.Control.impl_processCSS(Control.java:861)
>>       at javafx.scene.Parent.impl_processCSS(Parent.java:1191)
>>       at javafx.scene.Parent.impl_processCSS(Parent.java:1191)
>>       at javafx.scene.Parent.impl_processCSS(Parent.java:1191)
>>       at javafx.scene.Node.processCSS(Node.java:8443)
>>       at javafx.scene.Scene.doCSSPass(Scene.java:512)
>>       at javafx.scene.Scene.preferredSize(Scene.java:1498)
>>       at javafx.scene.Scene.impl_preferredSize(Scene.java:1565)
>>       at javafx.stage.Window$9.invalidated(Window.java:761)
>>       at
>> javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:107)
>>       at
>> javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:141)
>>       at javafx.stage.Window.setShowing(Window.java:827)
>>       at javafx.stage.Window.show(Window.java:842)
>>       at javafx.stage.Stage.show(Stage.java:242)
>>       at javafx.stage.Stage.showAndWait(Stage.java:408)
>>       at
>> ca.digitalrapids.kayak.gui.javafx.exp.SimplifiedExpressionEditor.showExpressionEditor(SimplifiedExpressionEditor.java:179)
>>       at
>> ca.digitalrapids.kayak.gui.pluggable.impl.javafx.PropertyContextMenuFactory$8.handle(PropertyContextMenuFactory.java:200)
>>       at
>> ca.digitalrapids.kayak.gui.pluggable.impl.javafx.PropertyContextMenuFactory$8.handle(PropertyContextMenuFactory.java:194)
>>       at
>> com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
>>       at
>> com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
>>       at
>> com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
>>       at
>> com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
>>       at
>> com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:113)
>>       at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
>>       at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
>>       at javafx.event.Event.fireEvent(Event.java:202)
>>       at javafx.scene.control.MenuItem.fire(MenuItem.java:460)
>>       at
>> com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1341)
>>       at
>> com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1316)
>>       at
>> com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$7.handle(ContextMenuContent.java:1284)
>>       at
>> com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$7.handle(ContextMenuContent.java:1282)
>>       at
>> com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
>>       at
>> com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
>>       at
>> com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
>>       at
>> com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
>>       at
>> com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
>>       at
>> com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:113)
>>       at
>> com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
>>       at
>> com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:113)
>>       at
>> com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
>>       at
>> com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:113)
>>       at
>> com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
>>       at
>> com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:113)
>>       at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
>>       at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
>>       at javafx.event.Event.fireEvent(Event.java:202)
>>       at javafx.scene.Scene$MouseHandler.process(Scene.java:3551)
>>       at javafx.scene.Scene$MouseHandler.process(Scene.java:3382)
>>       at javafx.scene.Scene$MouseHandler.access$1800(Scene.java:3334)
>>       at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1612)
>>       at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2402)
>>       at
>> com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:312)
>>       at
>> com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:237)
>>       at java.security.AccessController.doPrivileged(Native Method)
>>       at
>> com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:354)
>>       at com.sun.glass.ui.View.handleMouseEvent(View.java:519)
>>       at com.sun.glass.ui.View.notifyMouse(View.java:882)
>>       at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
>>       at
>> com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
>>       at
>> com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:101)
>>       at java.lang.Thread.run(Thread.java:724)
>> java.lang.NullPointerException
>>       at
>> com.sun.javafx.scene.control.skin.TextFieldSkin.updateSelection(TextFieldSkin.java:404)
>>       at
>> com.sun.javafx.scene.control.skin.TextFieldSkin.access$200(TextFieldSkin.java:66)
>>       at
>> com.sun.javafx.scene.control.skin.TextFieldSkin$6.invalidated(TextFieldSkin.java:208)
>>       at
>> com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:339)
>>       at
>> com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
>>       at
>> javafx.beans.property.ReadOnlyObjectWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyObjectWrapper.java:175)
>>       at
>> javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:141)
>>       at
>> javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:110)
>>       at
>> javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:143)
>>       at
>> javafx.scene.control.TextInputControl.selectRange(TextInputControl.java:870)
>>       at
>> com.sun.javafx.scene.control.behavior.TextFieldBehavior.handleFocusChange(TextFieldBehavior.java:128)
>>       at
>> com.sun.javafx.scene.control.behavior.TextFieldBehavior.access$000(TextFieldBehavior.java:65)
>>       at
>> com.sun.javafx.scene.control.behavior.TextFieldBehavior$1.changed(TextFieldBehavior.java:84)
>>       at
>> com.sun.javafx.scene.control.behavior.TextFieldBehavior$1.changed(TextFieldBehavior.java:81)
>>       at
>> com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:347)
>>       at
>> com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
>>       at
>> javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:71)
>>       at javafx.scene.Node$FocusedProperty.notifyListeners(Node.java:7233)
>>       at javafx.scene.Scene$13.invalidated(Scene.java:2004)
>>       at
>> javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:109)
>>       at
>> javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:143)
>>       at javafx.scene.Scene$KeyHandler.setFocusOwner(Scene.java:3700)
>>       at javafx.scene.Scene$KeyHandler.requestFocus(Scene.java:3746)
>>       at javafx.scene.Scene$KeyHandler.access$2200(Scene.java:3698)
>>       at javafx.scene.Scene.requestFocus(Scene.java:1973)
>>       at javafx.scene.Node.requestFocus(Node.java:7394)
>>       at
>> com.sun.javafx.scene.traversal.TraversalEngine.getTopLeftFocusableNode(TraversalEngine.java:156)
>>       at javafx.scene.Scene.focusInitial(Scene.java:1926)
>>       at javafx.scene.Scene.access$3400(Scene.java:187)
>>       at
>> javafx.scene.Scene$ScenePulseListener.focusCleanup(Scene.java:2278)
>>       at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2351)
>>       at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:358)
>>       at
>> com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:560)
>>       at
>> com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:540)
>>       at
>> com.sun.javafx.tk.quantum.QuantumToolkit$15.run(QuantumToolkit.java:425)
>>       at
>> com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:94)
>>       at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
>>       at
>> com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
>>       at
>> com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:101)
>>       at java.lang.Thread.run(Thread.java:724)
>>
>> (And the CSS isn't working properly for other things like the background of
>> menus)
>>
>> But with the default CSS it does work perfectly.
>>
>> Given that Skins are not really part of the public API, I don't know if I
>> should expect this to work or not.
>>
>> Scott
>

Reply via email to