Java 外部类成员变量Null到内部类

Java 外部类成员变量Null到内部类,java,inner-classes,private-members,jmonkeyengine,nifty-gui,Java,Inner Classes,Private Members,Jmonkeyengine,Nifty Gui,我正在使用JME3和漂亮的GUI开发一个游戏。我有一个外部类,它有一个Nifty成员变量。内部类应该能够访问该变量,而不管访问修饰符是什么。在构造函数中,我为它分配了一个新的Nifty对象。然而,当我在内部类中访问该变量时,我遇到了问题。我做了一点调试,发现这是因为内部类认为Nifty成员变量为null,我不知道为什么。它在外部类中不为null。由于这是一个JME3游戏,我试图让内部类实现AppState接口,但它仍然将Nifty成员变量显示为null。代码如下: public class Me

我正在使用JME3和漂亮的GUI开发一个游戏。我有一个外部类,它有一个
Nifty
成员变量。内部类应该能够访问该变量,而不管访问修饰符是什么。在构造函数中,我为它分配了一个新的
Nifty
对象。然而,当我在内部类中访问该变量时,我遇到了问题。我做了一点调试,发现这是因为内部类认为
Nifty
成员变量为null,我不知道为什么。它在外部类中不为null。由于这是一个JME3游戏,我试图让内部类实现
AppState
接口,但它仍然将
Nifty
成员变量显示为null。代码如下:

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;
    }
}
}
公共类菜单屏幕扩展了SimpleApplication{
/**用于配置漂亮的GUI*/
私人俏皮;
私有NiftyJmeDisplay mNiftyDisplay;
私有元素弹出;
//*******************
//压倒一切的方法
//*******************
/**此方法用于初始化显示游戏屏幕所需的所有内容*/
@凌驾
public void simpleInitApp(){
guiNode.detachAllChildren();
initNifty();
flyCam.setDragToRotate(真);
}
/**
*游戏的主要更新循环。
* 
*@param tpf Time Per Fram,每个循环运行所需的时间。
*/
@凌驾
公共无效simpleUpdate(浮动tpf){
//不用
}
@凌驾
公共void simplender(RenderManager rm){
//不用
}
公共静态void main(字符串[]args){
MenuScreen app=新建MenuScreen();
app.start();
}
/**
*帮助器方法来初始化和配置漂亮的GUI。
*/
私有void initNifty(){
mNiftyDisplay=新的NiftyJmeDisplay(资产管理器、输入管理器、音频渲染器、GUI视口);
mNifty=mNiftyDisplay.getNifty();
guiViewPort.addProcessor(mNiftyDisplay);
//如果在桌面上运行,则加载桌面主菜单。
if(Strings.OS|u NAME.contains(“windows”)| Strings.OS|u NAME.contains(“mac”)| Strings.OS|u NAME.contains(“linux”)){
mNifty.fromXml(“Interface/XML/DesktopMenuScreenGui.XML”,“start”,new MenuScreen().new MenuScreenGui());
}
//如果是Android设备,请加载移动主菜单。
else if(Strings.OS_NAME.contains(“android”)){
mNifty.fromXml(“Interface/XML/MobileMenuScreenGui.XML”,“mobile”,new MenuScreen().new MenuScreenGui());
}
}
//**************
//内部类
//**************
/**
*©Jason Crosby 2012
* 
*此类处理所有GUI交互,如按钮单击。
* 
*@作者杰森·克罗斯比
*/
公共类MenuScreenGui实现ScreenController、EventTopicSubscriber、,
AppState{
@凌驾
公共无效初始化(AppStateManager stateManager,应用程序应用程序){
}
@凌驾
公共空间清理(){
}
@凌驾
公共布尔值isEnabled(){
返回false;
}
@凌驾
公共布尔值已初始化(){
返回false;
}
@凌驾
public void postRender(){
}
@凌驾
已启用公共无效设置(布尔激活){
}
@凌驾
公共无效状态已附加(AppStateManager stateManager){
}
@凌驾
公共无效状态已分离(AppStateManager stateManager){
}
@凌驾
公共void渲染(RenderManager rm){
}
@凌驾
公共无效更新(浮动tpf){
}
@凌驾
公共无效绑定(漂亮漂亮,屏幕){
//不用
}
@凌驾
公共屏幕(){
//不用
}
@凌驾
开始屏幕上的公共无效(){
//不用
}
@凌驾
public void onEvent(字符串,MenuItemActivatedEvent t){
}
//**************
//类方法
//**************
/**
*单击播放按钮时调用。
*/
公共无效播放按钮(){
}
/**
*单击“高分”按钮时调用。
*/
公共空白高分按钮(){
}
/**
*单击“设置”按钮时调用。
*/
公共无效设置按钮(){
}
公用按钮(){
showDialog();
}
/**
*单击“速率”按钮时调用。仅在移动设备上可用。
*/
公共作废率按钮(){
}
/**
*单击“反馈”按钮时调用。仅在移动设备上。
*/
public void feedbackButton(){
}
/**
*单击“帮助”按钮时调用。
*/
公共无效帮助按钮(){
}
/**
*需要显示对话框时调用。
*/
公共对话框(){
System.out.println(“wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww”);
popup=new Nifty().createPopup(“popup”);
System.out.println(“zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;
//Menu myMenu=popup.findNiftyControl(“Menu”,Menu.class);
//myMenu.setWidth(新的SizeValue(“100px”);//必须设置
//myMenu.addMenuItem(“单击我!”,new menuItem(“menuItemid”,“诸如此类”);//menuItem是一个自定义类
//mNifty.subscribe(mNifty.getCurrentScreen()、myMenu.getId()、MenuItemActivatedEvent.class、this);
mNifty.showPopup(mNifty.getCurrentScreen(),popup.getId(),null);
}
公共无效clsoseDialog(){
}
/**
*用于将字符串返回到漂亮的xml文件。
* 
*@param name与字符串关联的名称键。
*@返回与键关联的字符串。
*/
公共字符串getString(字符串名称){
如果(名称等于(“播放”)){
返回字符串。播放按钮;
}
否则,如果(名称等于(“高分”)){
返回字符串。高分按钮;
}
else if(name.equals(“设置”)){
返回Strings.SETTINGS\u按钮;
}
else if(name.equals(“quit”)){
返回字符串。退出按钮;
}
如果(名称等于(“费率”)){
popup = new Nifty().createPopup("popup");
mNifty = mNiftyDisplay.getNifty();