Dynamically add button to nifty

I have a screen with a list of available objects the player can use. I need to be able to dynamically add buttons to this screen.

How do I (from java) add a button to an existing nifty screen?

It’s something like:

[java]new ButtonBuilder( {{
// Initialise button
}}).build(nifty, screen, parent);
parent.layoutElements();
[/java]

1 Like

OK, here’s what I’ve got:

[java]
public void newOrange()
{
new ButtonBuilder(“appendButton”, “Append”
){{
alignRight();
valignBottom();
height(“5%”);
width(“100%”);
visibleToMouse(true);
interactOnClick(“addRed()”);
}}.build(nifty, nifty.getScreen(“Layer_ID”), nifty.getScreen(“HUD”).findElementByName(“Layer_ID”).findElementByName(“tilePanel”));
nifty.getScreen(“HUD”).findElementByName(“Layer_ID”).findElementByName(“tilePanel”).layoutElements();
}[/java]

I’m getting the following error:
[java]
WARNING: Root Cause: java.lang.NullPointerException
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: mygame.RunningAppState$MyStartScreen newOrange (RunningAppState.java:607)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: mygame.RunningAppState$MyStartScreen endTurn (RunningAppState.java:601)//I hit the button “end turn” to add the new button…
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
[/java]

Any idea what’s wrong/how I can fix this?

(I extracted the error from this stack.)

May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker callMethod
WARNING: Exception: java.lang.reflect.InvocationTargetException
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: sun.reflect.NativeMethodAccessorImpl invoke0 (NativeMethodAccessorImpl.java:-2)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: sun.reflect.NativeMethodAccessorImpl invoke (NativeMethodAccessorImpl.java:57)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: sun.reflect.DelegatingMethodAccessorImpl invoke (DelegatingMethodAccessorImpl.java:43)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: java.lang.reflect.Method invoke (Method.java:606)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.NiftyMethodInvoker callMethod (NiftyMethodInvoker.java:145)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.NiftyMethodInvoker performInvoke (NiftyMethodInvoker.java:104)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty$DelayedMethodInvoke perform (Nifty.java:1174)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty invokeMethods (Nifty.java:1152)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty handleDynamicElements (Nifty.java:354)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty access$1700 (Nifty.java:77)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty$NiftyInputConsumerImpl processEvent (Nifty.java:1374)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty$NiftyInputConsumerImpl processMouseEvent (Nifty.java:1329)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme handleMouseEvent (InputSystemJme.java:124)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme onMouseButtonEventQueued (InputSystemJme.java:232)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme forwardEvents (InputSystemJme.java:296)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty update (Nifty.java:288)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme endInput (InputSystemJme.java:113)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.input.InputManager processQueue (InputManager.java:819)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.input.InputManager update (InputManager.java:883)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.app.Application update (Application.java:604)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.app.SimpleApplication update (SimpleApplication.java:231)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.system.lwjgl.LwjglAbstractDisplay runLoop (LwjglAbstractDisplay.java:151)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.system.lwjgl.LwjglDisplay runLoop (LwjglDisplay.java:185)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.system.lwjgl.LwjglAbstractDisplay run (LwjglAbstractDisplay.java:228)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: java.lang.Thread run (Thread.java:744)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: Root Cause: java.lang.NullPointerException
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: mygame.RunningAppState$MyStartScreen newOrange (RunningAppState.java:607)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: mygame.RunningAppState$MyStartScreen endTurn (RunningAppState.java:601)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: sun.reflect.NativeMethodAccessorImpl invoke0 (NativeMethodAccessorImpl.java:-2)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: sun.reflect.NativeMethodAccessorImpl invoke (NativeMethodAccessorImpl.java:57)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: sun.reflect.DelegatingMethodAccessorImpl invoke (DelegatingMethodAccessorImpl.java:43)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: java.lang.reflect.Method invoke (Method.java:606)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.NiftyMethodInvoker callMethod (NiftyMethodInvoker.java:145)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.NiftyMethodInvoker performInvoke (NiftyMethodInvoker.java:104)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty$DelayedMethodInvoke perform (Nifty.java:1174)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty invokeMethods (Nifty.java:1152)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty handleDynamicElements (Nifty.java:354)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty access$1700 (Nifty.java:77)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty$NiftyInputConsumerImpl processEvent (Nifty.java:1374)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty$NiftyInputConsumerImpl processMouseEvent (Nifty.java:1329)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme handleMouseEvent (InputSystemJme.java:124)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme onMouseButtonEventQueued (InputSystemJme.java:232)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme forwardEvents (InputSystemJme.java:296)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: de.lessvoid.nifty.Nifty update (Nifty.java:288)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.niftygui.InputSystemJme endInput (InputSystemJme.java:113)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.input.InputManager processQueue (InputManager.java:819)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.input.InputManager update (InputManager.java:883)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.app.Application update (Application.java:604)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.app.SimpleApplication update (SimpleApplication.java:231)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.system.lwjgl.LwjglAbstractDisplay runLoop (LwjglAbstractDisplay.java:151)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.system.lwjgl.LwjglDisplay runLoop (LwjglDisplay.java:185)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: com.jme3.system.lwjgl.LwjglAbstractDisplay run (LwjglAbstractDisplay.java:228)
May 04, 2014 7:55:40 AM de.lessvoid.nifty.NiftyMethodInvoker logException
WARNING: java.lang.Thread run (Thread.java:744)

As indicated by your stack trace, you have a null pointer on line:
mygame.RunningAppState$MyStartScreen newOrange (RunningAppState.java:607)

Oh, sorry, I should have adressed that. That’s this line (also visible above):

new ButtonBuilder(“appendButton”, “Append”){{

…so I don’t really know what it’s referring to. How can a string be null? It doesn’t make sense. Of course, it could be saying that something involved with the button builder is null… but it looks fine to me.

@ulfgur said: Oh, sorry, I should have adressed that. That's this line (also visible above):

new ButtonBuilder(“appendButton”, “Append”){{

…so I don’t really know what it’s referring to. How can a string be null? It doesn’t make sense. Of course, it could be saying that something involved with the button builder is null… but it looks fine to me.

That’s not the line. It can’t be.

Given the nature of the exception, it has to be in one of these two lines:
}}.build(nifty, nifty.getScreen(“Layer_ID”), nifty.getScreen(“HUD”).findElementByName(“Layer_ID”).findElementByName(“tilePanel”));
nifty.getScreen(“HUD”).findElementByName(“Layer_ID”).findElementByName(“tilePanel”).layoutElements();

So, either nifty is null, or getScreen(“HUD”) returns null, or findByElementName(“Layer_ID”) is null… etc.

This is simple debugging to sort out which one.

1 Like

Got it. I’ll check 'em.

Got it, thanks!

(for those of you who care, I had to add
Nifty nifty = stateManager.getState(MainMenuAppState.class).getNifty();
for some reason. I have nifty declared and referenced in my class, but it doesn’t like to reference it.
)

@pspeed:
Quick forum courtesy question: In some of the forums I’ve visited, a “problem child” like me who has waaaay too many questions should keep all of his issues in one thread, to prevent clutter. Is this more polite, or just an idiosyncrasy of certain forums?

@ulfgur said: Got it, thanks!

(for those of you who care, I had to add
Nifty nifty = stateManager.getState(MainMenuAppState.class).getNifty();
for some reason. I have nifty declared and referenced in my class, but it doesn’t like to reference it.
)

@pspeed:
Quick forum courtesy question: In some of the forums I’ve visited, a “problem child” like me who has waaaay too many questions should keep all of his issues in one thread, to prevent clutter. Is this more polite, or just an idiosyncrasy of certain forums?

Just an idiosyncrasy of certain forums. Here you will get better results if your posts are separate by topic and possess a proper subject. It also makes it easier for other people to find if they have the same/similar issue.

Got it.

@ulfgur said: a "problem child" like me

I race ya :wink:

Deal! Whoever can cause (and flail uselessly the most) the largest stack error by tomorrow wins!

(just kidding, that sounds like way too much effort.)

1 Like