Crash Inside Nifty renderElement

Hi all,

I just got a crash report - unfortunately from a not-logged-in user so its hard to follow up for more info just yet.

The stack trace is entirely in JME/Nifty though so I thought I’d post it here to see what people make of it. It looks to me almost like its trying to select part of a string that isn’t actually in the string. Maybe something to do with cut and paste?

ErrMsg: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
Exception: java.lang.StringIndexOutOfBoundsException: String index out of range: 14
at java.lang.String.substring(Unknown Source)
at
de.lessvoid.nifty.render.NiftyRenderEngineImpl.renderSelectionText(NiftyRenderEngineImpl.java:323)
at de.lessvoid.nifty.render.NiftyRenderEngineImpl.renderText(NiftyRenderEngineImpl.java:266)
at de.lessvoid.nifty.elements.render.TextRenderer.renderLine(TextRenderer.java:302)
at de.lessvoid.nifty.elements.render.TextRenderer.renderLines(TextRenderer.java:201)
at de.lessvoid.nifty.elements.render.TextRenderer.render(TextRenderer.java:182)
at de.lessvoid.nifty.elements.Element.renderElement(Element.java:734)
at de.lessvoid.nifty.elements.Element.render(Element.java:719)
at de.lessvoid.nifty.elements.Element.renderInternalChildElements(Element.java:751)
at de.lessvoid.nifty.elements.Element.renderChildren(Element.java:741)
at de.lessvoid.nifty.elements.Element.render(Element.java:722)
at de.lessvoid.nifty.elements.Element.renderInternalChildElements(Element.java:751)
at de.lessvoid.nifty.elements.Element.renderChildren(Element.java:744)
at de.lessvoid.nifty.elements.Element.render(Element.java:722)
at de.lessvoid.nifty.elements.Element.renderInternalChildElements(Element.java:751)
at de.lessvoid.nifty.elements.Element.renderChildren(Element.java:744)
at de.lessvoid.nifty.elements.Element.render(Element.java:713)
at de.lessvoid.nifty.elements.Element.renderInternalChildElements(Element.java:751)
at de.lessvoid.nifty.elements.Element.renderChildren(Element.java:744)
at de.lessvoid.nifty.elements.Element.render(Element.java:713)
at de.lessvoid.nifty.elements.Element.renderInternalChildElements(Element.java:751)
at de.lessvoid.nifty.elements.Element.renderChildren(Element.java:744)
at de.lessvoid.nifty.elements.Element.render(Element.java:722)
at de.lessvoid.nifty.elements.Element.renderInternalChildElements(Element.java:751)
at de.lessvoid.nifty.elements.Element.renderChildren(Element.java:744)
at de.lessvoid.nifty.elements.Element.render(Element.java:713)
at de.lessvoid.nifty.screen.Screen.renderLayers(Screen.java:314)
at de.lessvoid.nifty.Nifty.render(Nifty.java:321)
at com.jme3.niftygui.NiftyJmeDisplay.postQueue(NiftyJmeDisplay.java:178)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:979)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1035)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:185)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
at java.lang.Thread.run(Unknown Source)

Could this be a Nifty bug?

Any thoughts?

Thanks,
Z

Another tester managed to reproduce it for me!

If you copy into the clipboard text including a newline character (this is on windows so it may be a \r\n, maybe just a \n) then paste that into a text field and try and delete/modify etc you get the crash.

More testing shows that delete/modify is fine (although it all looks messy) - its selection that cases the crash.

ctrl v with text containing newlines at start and end… then hold down shift and press left arrow key…

For now as a work-around I’ve attached a filter to all the controls where it’s likely to happen, I had a look in the text field control code itself and wasn’t sure where the best place to fix it was, although the most likely place I saw was in

[java]private boolean filterAndInsert(final CharSequence chars) {[/java]

My work-around filter is as simple as this:
[java] private final TextFieldInputCharFilter textFieldFilter = new TextFieldInputCharFilter() {

    public boolean acceptInput(int i, char c) {
        return c != '\n' && c != '\r';
    }
};

[/java]

1 Like