在netbeans GUI按钮上执行操作时,类的实例为“null”

时间:2011-04-28 21:42:00

标签: java user-interface netbeans button nullpointerexception

我有一个程序完成了许多类,这些类创建了复杂的对象,包含自定义变量和某些变量的数组。我想将这些类的功能绑定到我的netbeans GUI中的某些按钮和其他组件(例如jTextPanes)上的actionperformed()方法调用。

我真的需要将所有代码移植到UI表单类中吗?我现在不相信我这样做,因为我已经完成了调试程序,检查某些变量的状态,一切都是应该的。但是,当我通过推动我的一个“按钮”来达到断点时,UI表单中使用的类的实例突然变为“空”。这让我很困惑,因为在我按下按钮之前它正在引用类的正确实例。

我是netbeans GUI建筑的新手,这可能解释了我在这方面的无能。

所有建议都欢迎你们。

这是与我按下的按钮相关的代码:

private void submitDetailsButtonMouseClicked(java.awt.event.MouseEvent evt) 
{
    //outputTextArea.setText("Get out");
    dM.dHist2.frameStack[dM.dHist2.frameAmount].setAccomName("Win");
    dM.dHist2.saveAndStoreFrame();
}

这里的'dM'是主要的DiscourseManager类(我自己的作品)的实例,在这里:

public static void main(String args[]) 
{
    DiscourseManager dM = new DiscourseManager();

    java.awt.EventQueue.invokeLater(new Runnable()
    {

        public void run()
        {
         new DialogueManagerUI().setVisible(true);
        }
    });

    dM.startTransaction();
    dM.runDemo();

}

请记住,此代码都在UI表单中。我在下面的表单顶部声明了一个dM的本地实例:

public class DialogueManagerUI extends javax.swing.JFrame { public static DiscourseManager dM; .... }

当我到达断点时,在dM.runDemo()行中可以识别类的实例。然而,一旦我点击按钮并且另一个断点被击中(在按钮方法上放置一个断点),它表示dM为空。我希望这只是一个我错过的非常愚蠢的错误,因为重新安排我的所有代码只会为了演示目的添加一个用户界面而破坏灵魂。

1 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是设置静态dM

final DiscourseManager dM = new DiscourseManager();

java.awt.EventQueue.invokeLater(new Runnable()
{

    public void run()
    {
     DialogueManagerUI.dM = dM;
     new DialogueManagerUI().setVisible(true);
    }
});

但是如果你想通过消除公共静态成员来获得一种更清洁的方式,那么

试试这个

public class DialogueManagerUI extends javax.swing.JFrame { 

private final DiscourseManager dM; 
DialogueManagerUI(DiscourseManager dM)
{
    this.dM = dM;
}

...
}

public static void main(String args[]) 
{
    final DiscourseManager dM = new DiscourseManager();

    java.awt.EventQueue.invokeLater(new Runnable()
    {

        public void run()
        {
         new DialogueManagerUI(dM).setVisible(true);
        }
    });