2016-03-31 14 views
0

ich Strings von einer Klasse in einer anderen übergeben bin versucht, so kann ich die Etiketten initialisieren die Benutzername nach.Java - Passing Wert von einer Klasse in einer anderen

Hier ist mein Code:

while (rs.next()) { 
        uID = rs.getString("ID"); 
        uLoginName = rs.getString("user_login"); 
        uNiceName = rs.getString("user_nicename"); 
        password = rs.getString("user_pass"); 

        if (uLoginName.equals(username) && password.equals(enteredPass)) { 

         ***//Values That I am Trying to pass*** 

         TutorControlPanelController panel = new TutorControlPanelController(); 
         panel.setUserLoginName(uLoginName); 
         try { 

          Parent root = FXMLLoader.load(getClass().getResource("SomePath")); 
          Scene scene = new Scene(root); 
          String css = this.getClass().getResource("Style.css").toExternalForm(); 
          scene.getStylesheets().add(css); 
          Stage stage = new Stage(); 
          stage.setTitle("Tutor Control Panel"); 
          stage.setScene(scene); 

          stage.show(); 

         } catch (IOException ex) { 
          Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex); 
         } 
        } else { 
         System.out.println("user not found"); 

        } 

       } 

      } catch (SQLException ex) { 
       Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex); 
      } 

in anderen Klasse, ich

 public class SomeClass implements Initializable { 

    @FXML 
    private GridPane gridView; 
    @FXML 
    private Button recordButton; 
    @FXML 
    private Button stopButton; 
    @FXML 
    private MenuButton settingsButton; 
    @FXML 
    private MenuItem qualitySettings; 
    @FXML 
    private MenuItem videoSettings; 
    @FXML 
    private Button lessoncategory; 
    @FXML 
    private MenuButton serverUpload; 
    @FXML 
    private MenuItem startUpload; 
    @FXML 
    private MenuItem stopUpload; 
    @FXML 
    private Button timer; 
    @FXML 
    private Label timerHours; 
    @FXML 
    private Label timerMinutes; 
    @FXML 
    private Label timerSeconds; 
    @FXML 
    private Button logOut; 
    @FXML 
    private Label uNameLabel; 

    private String uID; 
    private String username; 
    private String userLoginName; 
    private String userNiceName; 

    public TutorControlPanelController(String uID, String username, String userNiceName) { 
     this.uID = uID; 
     this.username = username; 
     this.userNiceName = userNiceName; 

    } 

    /** 
    * Initializes the controller class. 
    */ 
    public TutorControlPanelController() { 

    } 

    public String getuID() { 
     return uID; 
    } 

    public void setuID(String uID) { 
     this.uID = uID; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getUserNiceName() { 
     return userNiceName; 
    } 

    public void setUserNiceName(String userNiceName) { 
     this.userNiceName = userNiceName; 
    } 

    public String getUserLoginName() { 
     return userLoginName; 
    } 

    public void setUserLoginName(String userLoginName) { 
     this.userLoginName = userLoginName; 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     assert uNameLabel != null : "fx:id=\"someID\" was not injected: check your FXML file 'somePath'."; 

     setlabels(); 


    } 

    public void setlabels() { 
     uNameLabel.setText(getUserLoginName()); 

     // and just to check also printing the value 

     System.out.println(getUserLoginName()); 
    } 

AKTUALISIERT tue Alles, was ich immer bin, ist null Ich finde es schwer, was genau herauszufinden, wird auf.

+0

Können Sie Code schreiben beide aus den Klassen, in denen Sie das Abrufen und Wert-Einstellung für Name Benutzer-Login? –

+0

können Sie bitte überprüfen Sie es jetzt mate –

+0

Sind Sie sicher, dass setlabels() nach dem setUserLoginName() aufgerufen wird? Da es einen Standardkonstruktor gibt und keine spezifische Anforderung, dass setuserLoginName notwendigerweise aufgerufen wird, würde ich die Instanzvariablen auf einen leeren String initialisieren, um NPE-Probleme zu vermeiden. Oder entfernen Sie den Standardkonstruktor wenn möglich. – KevinO

Antwort

0

Ich sehe nicht, wo Sie in Ihrem zweiten erste Klasse nennen. Sie müssen die erste als Attribut für die zweite Instanz angeben, dann erhalten Sie den userLoginName.

Dies ist, was Sie in Ihrer zweiten Klasse tun können:

FirstClass myFirstClass = new FirstClass(); 
uNameLabel.setText(myFirstClass.getUserLoginName()); 
0

Im Moment die Klasse TutorControlPanelController hat ein Standard-Konstruktor und eine parametrisierte Konstruktor. Wenn der Standardkonstruktor aufgerufen wird, werden die String-Instanzvariablen alle auf null initialisiert. Sie können durch Aufruf der verschiedenen Methoden festgelegt werden, aber es gibt keine Garantie, dass sie sein werden.

Der bessere Ansatz wäre es, das Standard-Konstruktor zu entfernen (diesen Code löschen):

public TutorControlPanelController() { 

} 

Und im Code-Schnipsel mit dem rs.next(), um den Anruf ändern Sie den parametrisierte Konstruktor zu verwenden:

if (uLoginName.equals(username) && password.equals(enteredPass)) { 
    TutorControlPanelController panel = new TutorControlPanelController(uId, uLoginName, uNiceName); 

    try { 
    ... 

Dieser Ansatz würde sicherstellen, dass die meisten Instanzvariablen initialisiert wurden.

Allerdings, da hier nicht genügend Code ist, weiß ich nicht, ob es eine Rahmenbedingung für den Standardkonstruktor gibt. Ist dies der Fall, initialisieren Sie die String-Instanzvariablen so, dass sie eine leere Zeichenfolge haben

Sie vermeiden in diesem Fall NPEs.

+0

Nein, es gibt keine Rahmenbedingung. Lass mich diesen Ansatz versuchen. Vielen Dank. –

Verwandte Themen