2015-02-20 2 views
0

Я пытаюсь выполнить метод в другом классе, но моя ссылка равна null.У меня есть ссылка на класс, который является нулевым

У меня есть основной класс калькулятора, который начинается так:

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», правда);:

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

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

Конструктор контроллера:

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

} 

Но у меня также есть конструктор без аргументов, что я должен был сделать при регистрации контроллера в качестве слушателя, как вы видите в коде кнопки выше. Проблема в том, когда дело доходит до view.toggleBorder .., ссылка на вид имеет значение null, поэтому он выбрасывает исключение нулевого указателя. Я думаю, что есть проблема с гармонией моих классов, но я не могу найти, где могут быть проблемы. Этот код фрагментирован. Прошу прощения. Вы можете посмотреть исходные файлы на GitHub

+0

Где вызывается исключение null-указателя? – beresfordt

+0

@beresfordt view.toggleBorder ('1', true); внутри класса контроллера – KiloJKilo

+0

Вашему представлению требуется ссылка на контроллер, который контролирует его. Экземпляр, который вы регистрируете на своей кнопке, не знает ни представления, ни модели.Создайте метод в представлении, называемый setController, который вы ДОЛЖНЫ звонить после того, как вы построите свой первый контроллер. – MadProgrammer

ответ

1

В вашем Посмотреть класс, когда ты инициализируйте все ваши кнопки и компоненты, вы запустите btnOne.addActionListener(new Controller()); для каждой кнопки. Проблема заключается в том, что вы создаете новый экземпляр контроллера для каждой кнопки, ни один из которых не имеет экземпляров для вашей модели или объектов вида.

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

Один из способов решения этой проблемы - сделать статическую переменную экземпляра контроллера в классе калькулятора и добавить методы к контроллеру, чтобы дать View и Model тоже его. Добавляйте слушателей к своим кнопкам со своим статическим экземпляром и добавляйте слушателей только после того, как ваш контроллер имеет экземпляр View.

+0

Да, я подозревал, что возникла проблема с созданием нового экземпляра контроллера для каждой кнопки. Я все еще участвую, и я не собрал способ назвать одного слушателя, который охватывает все кнопки. – KiloJKilo

+0

Вы должны думать об этом с точки зрения объектов. Вы создали новый объект для каждой кнопки, но должны передавать один и тот же объект каждой кнопке. – REGAL

+0

Вы видите проблему с заказом, для которого вещи создаются? Когда я вхожу в это с помощью отладчика, я вижу, что при создании представления View theView = new View() модель и контроллер имеют нулевое значение внутри представления. Когда объект создается, он выполняет инициализацию фрейма под функцией initialize() в классе представления. Итак, теперь, когда создается CreateController = newController (модель, представление), детали для просмотра прикручиваются. далее вниз CalcView выполняется. это не кажется правильным. – KiloJKilo

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); 

Вы могли бы сделать, таким образом, в контроллерах конструктора вместо этого, если вы желаете

Смежные вопросы