2

Я по-прежнему новичок в использовании MVC, и использование ActionListener дает мне проблему с запуском программы, в этом случае, когда NullPointerException приходит как вывод.Java MVC ActionListener NullPointerException

Цель имеет кнопку возврата, которая возвращает пользователя из второго меню в главное меню.

Когда я прокомментировал эту строку на контроллере, ошибка исчезнет. this.theView.addComBackButtonListener (новый CompanyBackBtnListener());

Исправьте меня, если я ошибаюсь, но я думаю, что он не может найти CompanyBackBtnListener, даже если его там.

  • Проверьте наличие опечаток.

Я попытался сузить кодировки. Если я пропущу какие-либо подробности Если у вас есть какие-либо решения, скажите, пожалуйста, как я все еще изучаю Java. Спасибо.

Взгляд

public class HRMSViewGUI extends JFrame { 

//Declarations here 

private JButton exitCusBtn; 


// Main Menu 
public HRMSViewGUI() 
     { 
      this.setTitle("Human Resource Management System"); 
      this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      this.setSize(600,225); 
      this.setResizable(false); 
      this.setLocationRelativeTo(null); 
      this.add(HRMSMenu); 

      // Main Menu GUI/Buttons place here. 
      // This contains the Main Menu buttons and GUI only. 

// Second Menu 
public void comMenu(){ 
       comFrame = new JFrame(); 
       comFrame.setTitle("Company Menu - HRMS SYSTEM"); 
       comFrame.setResizable(false);    
       comFrame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       comFrame.setSize(600,225); 
       comFrame.setLocationRelativeTo(null); 
       comFrame.setVisible(true); 

       // Swings Codings... Buttons. 

       // This is the Back/Return button. 
       GridBagConstraints cusConc = new GridBagConstraints(); 
       exitCusBtn = new JButton("Exit to Menu"); 
       exitCusBtn.setToolTipText("Go back to the Main Menu."); 
       cusConc.gridx = 3; 
       cusConc.gridy = 8; 
       cusConc.fill = GridBagConstraints.HORIZONTAL; 
       cusConc.insets = new Insets(5,0,0,0); 
       cusContainer.add(exitCusBtn,cusConc); 
     } 

    void addComBackButtonListener(ActionListener listenerforComBackButton){ 
      exitComBtn.addActionListener(listenerforComBackButton); 
    } 
} 

Контроллер

public class HRMSControlGUI { 
    private HRMSViewGUI theView; 
    private HRMSModel theModel; 

    public HRMSControlGUI(HRMSViewGUI theView, HRMSModel theModel){ 

     this.theView = theView; 
     this.theModel = theModel; 

     //set Listener for the Controller to detect the ActionListener of the View. 
     this.theView.addComBackButtonListener(new CompanyBackBtnListener()); 
    }   

private class CompanyBackBtnListener implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
    // Enable Main Menu 
     theView.setEnabled(true); 
    } 

Главная

public class HRMSapp { 
    public static void main(String[] args) { 
     HRMSViewGUI theView = new HRMSViewGUI(); 
     HRMSModel theModel = new HRMSModel(); 
     HRMSControlGUI theController = new HRMSControlGUI(theView, theModel); 
     theView.setVisible(true); 
    } 

ответ

1

Он имеет значение exitComBtn должен быть создан до того, как будет выдан addComBackButtonListener. Вам нужен код, например JButton exitComBtn = new JButton("Click me!");, перед тем как позвонить в addComBackButtonListener.

Я не уверен, что общий дизайн приложения, но попробуйте поместить объявление кнопки в конструктор HRMSViewGUI. Таким образом, кнопка создается при создании GUI (если это то, что вы хотите).

+0

Я хотел, чтобы exitComBtn был создан на comMenu, который является вторым меню. Поэтому он вернет меня из второго меню в главное меню. – Mark

+0

@Mark. Ок должна быть в состоянии добавить actionListener сразу после объявления exitComBtn. Единственное, что ваш класс слушателя - это частный класс в контроллере. Возможно, вам придется переместить его, чтобы класс вида мог его видеть. – raylee

+0

actionListener для exitComBtn уже объявлен в нижней части контроллера – Mark

0

Похоже переменной exitComBtn еще не установлен, когда в вашем контроллере вызывается метод addComBackButtonListener. Вероятно, потому что вы создаете его в методе comMenu, который не вызывается в контроллере (или, по крайней мере, не до того, как вызывается addComBackButtonListener).

+0

как мы его устанавливаем? – Mark