我正在尝试在另一个类中执行一个方法,但我的引用为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
上查看源文件答案 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);
如果您希望
,您可以在控制器构造函数中执行此操作