1

J'ai un Gui avec plusieurs classes différentes qui utilise le même eventhandler. Un problème auquel je n'arrive pas à trouver de solution est comment éviter d'obtenir une exception nullpointer lorsque le gestionnaire d'événements recherche l'appel de la bonne méthode et tombe sur un bouton qui doit encore être initialisé. J'ai quelques boutons qui ne seront initialisés que lorsque l'utilisateur entrera dans une étape createAccountGui.JavaFX eventhandler nullpointerException

public class GuiHandler implements EventHandler<ActionEvent> { 
    // this class take care off the EventHandler (buttons, all the buttons method). 
    private UserGui uG; 
    private AdvSearch aS; 
    private LogIn logI; 
    private CreateAccGui cAG; 
    private OrganizerGui oG; 
    private AdminGui aG; 
    private PersonRegister pR; 

    public GuiHandler() { 
     uG = new UserGui(this); 
    } 

À moins CreateAccGui a été initialisé, chaque fois qu'il vient à la cAG.getRegistrate() je reçois un NullPointerException. Est-ce que n'importe qui a une manière intelligente de manipuler ce genre de problème sans devoir le diviser en plusieurs gestionnaires différents.

@Override 
    public void handle(ActionEvent e) { 
     try { 
      //where all the button goes 2 when clicked on and perform the method they are supposed 2 do 
      // UserGui class buttons 
      if(e.getSource() == uG.getLogInB()) { 
       logI = new LogIn(this); 
      } else if (e.getSource() == uG.getAdvSearch()) { 
       aS = new AdvSearch(this); 
      } else if (e.getSource() == uG.getSearch()) { 

      } 
      // the buttons in LogIn class 
      else if(e.getSource() == logI.getSignIn()) { 
       signIn(); 
      } else if(e.getSource() == logI.getCreateAcc()) { 
       logI.logInStage.close(); 
       cAG = new CreateAccGui(this); 
      } 
      //the buttons in CreateAccGui class 
      else if(e.getSource() == cAG.getRegistrate()) { 
       System.out.println("it stop here on registrate"); 
       createAccount(); 
      } else if(e.getSource() == cAG.getCancelReg()) { 
       cAG.getCreateStage().close(); 
       logI = new LogIn(this); 
      } 
      //the buttons in AdminGui for setting text from the admin field 2 the userGui 
      else if(e.getSource() == aG.getAdmLogout()) { 
       aG.stage.close(); 
      } else if(e.getSource() == aG.getHomeAreaButton()) { 
       uG.getHomeNews().setText(aG.getHomeArea().getText()); 
      } else if(e.getSource() == aG.getAboutButton()) { 
       uG.getAboutArea().setText(aG.getAboutArea().getText()); 
      } else if(e.getSource() == aG.getRentButton()) { 
       uG.getRentArea().setText(aG.getRentArea().getText()); 
      } 
     } catch(NumberFormatException nfe) { 
      JOptionPane.showMessageDialog(null, "Feil format på noen felter, gjerne endre på dem", "Nummer Format", JOptionPane.ERROR_MESSAGE); 
     } 
    } // End of Handler method 
}// End of GuiHandler class 

Répondre

0

Ajouter un chèque nul au code qui utilise cAG

 /* right here */ 
else if( cAG != null && e.getSource() == cAG.getRegistrate()) { 

System.out.println("it stop here on registrate"); 
    createAccount(); 
} 

Le symbole &&short circuits si elle est fausse et ne sera jamais atteindre le cAG.getRegistrate() si cAG est nul

BTW JOptionPane fait partie de swing, et java 8 mise à jour 40 est sorti avec une nouvelle API de dialogue JavaFX

0

Au début de votre gestionnaire d'événements obtenir la source de l'événement et mis à une variable:

@Override 
public void handle(ActionEvent e) { 
    Button sourceBtn = (Button) e.getSource(); 
    try { 
     //where all the button goes 2 when clicked on and perform the method they are supposed 2 do 
     // UserGui class buttons 
     switch(sourceBtn.getText()){ 
     case "LogIn": 
      logI = new LogIn(this); 
      break; 
     case "Advanced Search": 
      aS = new AdvSearch(this); 
      break; 
     case "Search": 
      break; 
     case "Sign In": 
      signIn(); 
     break; 
     case "Create Acc": 
      logI.logInStage.close(); 
      cAG = new CreateAccGui(this); 
     break; 
     case "Registrate": 
      System.out.println("it stop here on registrate"); 
      createAccount(); 
      break; 
     case "Cancel Reg": 
      cAG.getCreateStage().close(); 
      logI = new LogIn(this); 
     break; 
     case "AdmLogout": 
      aG.stage.close(); 
      break; 
     case "HomeAreaButton": 
      uG.getHomeNews().setText(aG.getHomeArea().getText()); 
     break; 
     case "About": 
      uG.getAboutArea().setText(aG.getAboutArea().getText()); 
     break; 
     case "Rent": 
      uG.getRentArea().setText(aG.getRentArea().getText()); 
      break; 
     } 
    } catch(NumberFormatException nfe) { 
       JOptionPane.showMessageDialog(null, "Feil format på noen felter, gjerne endre på dem", "Nummer Format", JOptionPane.ERROR_MESSAGE); 
      } 
     } // End of Handler method 
    }// End of GuiHandler class 

Ensuite, vous pouvez mettre votre logique dans une instruction switch par bouton. De cette façon, vous n'avez pas besoin de passer par toutes ces déclarations si à la recherche de la source. Je ne pense pas que vous pouvez utiliser Button directement dans une instruction switch, mais vous pouvez utiliser le texte dans le bouton.

+0

Merci, ça marche, mais je pense qu'il peut se chevaucher avec d'autres boutons avec des points si certains boutons ont le même nom, comme on compare le getText() du bouton. Im encore un novice en Java donc si je me trompe me corriger ^^, –