我有一个null的类的引用

时间:2015-02-20 22:04:43

标签: java class model-view-controller

我正在尝试在另一个类中执行一个方法,但我的引用为null。

我有一个Main计算器类,就像这样开始:

public class Calculator {

public static void main( String[] args ) {

    // create new model, view and controller
    Model theModel = new Model();
    View theView = new View();
    Controller theController = new Controller( theModel, theView );

    /* start it up */
    theView.CalcView();

视图类中,我创建了按钮,将控制器注册为侦听器:

    btnZero = new JButton( "0" );
    btnZero.addActionListener( new Controller() );
    btnZero.setBounds( 167, 174, 86, 23 );
    frame.getContentPane().add( btnZero );

同样在视图类内部,我按下了按键:

    private void keyPressed( KeyEvent e, Controller controller ) {
    controller.keyPressed( e );
}

我目前的目标是使用击键 view.toggleBorder('1',true)从控制器类执行视图类中的方法;

    public void keyPressed( KeyEvent e ) {
    char key = e.getKeyChar();

    switch ( key ) {
    case '1':
    System.out.println( "1" );
    view.toggleBorder( '1', true );
    break;

Controller构造函数:

    public Controller( Model model, View view ) {
    this.model = model;
    this.view = view;

}

但是我也有一个无参数的构造函数,我必须在将控制器注册为监听器时,如上面的按钮代码所示。问题是,当涉及 view.toggleBorder .. 时,对视图的引用为null,因此它会抛出空指针异常。我认为课程的和谐存在问题,但我无法找到可能出现问题的地方。这段代码是碎片我道歉。您可以在GitHub

上查看源文件

2 个答案:

答案 0 :(得分:1)

在初始化所有按钮和组件的View类中,为每个按钮运行btnOne.addActionListener( new Controller() );。这样做的问题是您正在为每个按钮创建一个新的控制器实例,其中没有一个实例具有模型或视图对象的实例。

你在这里遇到的另一个问题是你有两个类,每个类都需要另一个类的全功能实例才能完全发挥作用。

解决这个问题的一种方法是在Calculator类中创建一个Controller的静态实例变量,并向Controller添加方法以给出View和Model。只使用静态实例将监听器添加到按钮,并且只在Controller具有View实例后添加监听器。

答案 1 :(得分:0)

您的视图需要引用控制它的控制器。注册到按钮的实例不了解视图或模型。

在视图中创建一个名为setController的方法,在构造控制器之后必须调用该方法

// create new model, view and controller
Model theModel = new Model();
View theView = new View();
Controller theController = new Controller( theModel, theView );

 theView.setController(theController);

如果您希望

,您可以在控制器构造函数中执行此操作