Переменная члена внешнего класса От нуля до внутреннего класса

Я работаю над игрой, используя JME3 и Nifty GUI. У меня есть внешний класс, который имеет Nifty переменная-член. И внутренний класс должен иметь возможность доступа к этой переменной независимо от модификатора доступа. В конструкторе я назначаю новый Nifty возражать против этого. Однако, когда я получаю доступ к этой переменной во внутреннем классе, я сталкиваюсь с проблемами. Я сделал небольшую отладку и обнаружил, что это потому, что внутренний класс думает, что Nifty переменная-член имеет значение null, и я не могу понять, почему. Это не нуль во внешнем классе. Так как это игра JME3, я попытался, чтобы внутренний класс реализовал AppState интерфейс, но он по-прежнему показывает Nifty переменная-член как ноль. Вот код:

public class MenuScreen extends SimpleApplication {



/** Used to configure Nifty GUI. */
private Nifty mNifty;

private NiftyJmeDisplay mNiftyDisplay;


private Element popup;

//*******************
// Overridden medhods
//*******************

/** This method is used to initialize everything needed to display the game screen. */
@Override
public void simpleInitApp() {
    guiNode.detachAllChildren();

    initNifty();

    flyCam.setDragToRotate(true);
}

/**
 * The game's main update loop.
 * 
 * @param tpf Time Per Fram, the time it takes each loop to run.
 */
@Override
public void simpleUpdate(float tpf) {
    // not used
}

@Override
public void simpleRender(RenderManager rm) {
    // not used
}

public static void main(String[] args) {
    MenuScreen app = new MenuScreen();
    app.start();
}

/**
* Helper method to initialize and configure Nifty GUI.
*/
private void initNifty() {        
    mNiftyDisplay = new NiftyJmeDisplay(assetManager, inputManager, audioRenderer, guiViewPort);
    mNifty = mNiftyDisplay.getNifty();

    guiViewPort.addProcessor(mNiftyDisplay);

    // If this is being run on a desktop then load the desktop main menu.
    if (Strings.OS_NAME.contains("windows") || Strings.OS_NAME.contains("mac") || Strings.OS_NAME.contains("linux")) {
        mNifty.fromXml("Interface/XML/DesktopMenuScreenGui.xml", "start", new MenuScreen().new MenuScreenGui());
    }
    // If its an Android device load the mobile main menu.
    else if (Strings.OS_NAME.contains("android")) {
        mNifty.fromXml("Interface/XML/MobileMenuScreenGui.xml", "mobile", new MenuScreen().new MenuScreenGui());
    }
}

//**************
// Inner Classes
//**************

/**
 * © Jason Crosby 2012 <p>
 * 
 * This class handles all the GUI interactions like button clicks.
 * 
 * @author Jason Crosby
 */
public class MenuScreenGui implements ScreenController, EventTopicSubscriber<MenuItemActivatedEvent>,
                                      AppState {

    @Override
    public void initialize(AppStateManager stateManager, Application app) {

    }
@Override
    public void cleanup() {

    }

    @Override
    public boolean isEnabled() {
        return false;
    }

    @Override
    public boolean isInitialized() {
        return false;
    }

    @Override
    public void postRender() {

    }

    @Override
    public void setEnabled(boolean active) {

    }

    @Override
    public void stateAttached(AppStateManager stateManager) {

    }

    @Override
    public void stateDetached(AppStateManager stateManager) {

    }

    @Override
    public void render(RenderManager rm) {

    }

    @Override
    public void update(float tpf) {

    }
    @Override
    public void bind(Nifty nifty, Screen screen) {
        // not used
    }

    @Override
    public void onEndScreen() {
        // not used
    }

    @Override
    public void onStartScreen() {
        // not used
    }

    @Override
    public void onEvent(String string, MenuItemActivatedEvent t) {

    }

    //**************
    // Class methods
    //**************

    /**
     * Called when the play button is clicked.
     */
    public void playButton() {

    }

    /**
     * Called when the high scores button is clicked.
     */
    public void highScoresButton() {

    }

    /**
     * Called when the settings button is clicked.
     */
    public void settingsButton() {

    }
    public void quitButton() {
        showDialog();
    }

    /**
     * Called when the rate button is clicked. Only Available on mobile.
     */
    public void rateButton() {

    }

    /**
     * Called when the feedback button is clicked. Only on mobile devices.
     */
    public void feedbackButton() {

    }

    /**
     * Called when the help button is clicked.
     */
    public void helpButton() {

    }

    /**
     * Called when the dialog needs to be shown.
     */
    public void showDialog() {
        System.out.println("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW");
        popup = new Nifty().createPopup("popup");
        System.out.println("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ");
        //Menu myMenu = popup.findNiftyControl("#menu", Menu.class);
        //myMenu.setWidth(new SizeValue("100px")); // must be set
        //myMenu.addMenuItem("Click me!", new menuItem("menuItemid", "blah blah")); // menuItem is a custom class
        //mNifty.subscribe(mNifty.getCurrentScreen(), myMenu.getId(), MenuItemActivatedEvent.class, this);
        mNifty.showPopup(mNifty.getCurrentScreen(), popup.getId(), null); 
    }

    public void clsoseDialog() {

    }

    /**
     * Used to return a String to the Nifty xml file.
     * 
     * @param name The name key associated with the String.
     * @return The String associated with the key.
     */
    public String getString(String name) {
        if (name.equals("play")) {
            return Strings.PLAY_BUTTON;
        }
        else if (name.equals("high_score")) {
            return Strings.HIGH_SCORES_BUTTON;
        }
        else if (name.equals("settings")) {
            return Strings.SETTINGS_BUTTON;
        }
        else if (name.equals("quit")) {
            return Strings.QUIT_BUTTON;
        }
        else if (name.equals("rate")) {
            return Strings.RATE_BUTTON;
        }
        else if (name.equals("feedback")) {
            return Strings.FEEDBACK_BUTTON;
        }
        else if (name.equals("rules")) {
            return Strings.RULES_BUTTON;
        }
        return null;
    }
}
}

Что происходит, я нажимаю на кнопку выхода, которая вызывает quitButton() метод. Это отлично работает. Это в свою очередь вызывает showDialog() вот где проблема. в showDialog() метод это линия popup = new Nifty().createPopup("popup"); и именно на этой линии, которая mNifty является нулевым, когда это не должно быть. Любая помощь приветствуется.

1 ответ

Решение

Линия

popup = new Nifty().createPopup("popup");

не использует mNifty, Это создает новый экземпляр Nifty а потом звонит creatPopup() на этом новом экземпляре. Так как раньше вы инициализировали mNifty вызывая то, что выглядит как фабричный метод

mNifty = mNiftyDisplay.getNifty();

вполне возможно, что получение Nifty с помощью new не возвращает полностью инициализированный экземпляр. Поскольку вы не опубликовали код для Nifty неясно, что происходит.

Я бы перепроверил, чтобы убедиться, что создание Nifty с помощью new вернет полностью инициализированный экземпляр, и что вы действительно хотели новый экземпляр здесь.

Другие вопросы по тегам