2017-11-28 2 views
2

Ich versuche, eine Zeichenfolge zwischen Szenen in JavaFX zu übergeben, ich folgte bereits der some answers, aber es scheint, dass sie nicht funktionieren, da die Zeichenfolge in der neuen Szene null ist.Kann Attribut zwischen Szenen nicht übergeben JAvaFX

Hier ist mein MainControler:

public class FXMLDocumentController implements Initializable { 


    @FXML 
    private Button btn_signup; 
    @FXML 
    private TextField et_username; 
    @FXML 
    private PasswordField et_password; 
    @FXML 
    private Hyperlink link_login; 

    Stage prevStage; 

    public void setPrevStage(Stage stage){ 
     this.prevStage = stage; 
    } 

    @FXML 
    private void handleButtonAction(ActionEvent event) throws IOException { 

     if(btn_signup == event.getSource()){ 
      Conector conn = new Conector(); 

     if (conn.checkUser(et_username.getText(), et_password.getText())) { 
        FXMLLoader myLoader = new FXMLLoader(getClass().getResource("FXMLTasker.fxml")); 
         Pane myPane = (Pane)myLoader.load(); 



        Scene scene = new Scene(myPane); 

        Stage stage = new Stage(); 

        stage.setResizable(false); 
        stage.setScene(scene); 

        FXMLTaskerController controler = new FXMLTaskerController(); 
        controler.setUser(et_username.getText()); 
        myLoader.setController(controler); 
        prevStage.close(); 
        stage.show(); 
     }else { 
      JOptionPane.showMessageDialog(null, "Usuario o Contraseña incorrecta"); 
     } 

     }else if (link_login == event.getSource()){ 
      System.out.println("Registrate!"); 
     } 


    } 

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

} 

Hier ist die andere Klasse Controler, die, wo ich meinen String will.

public class FXMLTaskerController implements Initializable { 


    @FXML private ListView list_todo; 
    @FXML private ListView list_done; 
    @FXML public String username; 

    private void handleButtonAction(ActionEvent event) { 


    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     System.out.println(username); 
     list_todo.setCellFactory(new TaskCellFactory()); 
     list_done.setCellFactory(new TaskCellFactory()); 
     try { 
      getTasks(); 
     } catch (IOException ex) { 
      Logger.getLogger(FXMLTaskerController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 



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

    public void getTasks() throws IOException{ 
     Conector con = new Conector(); 
     for(Task task: con.obtenerTareas("pepin")){ 
      System.out.println(task); 
      if(task.isState()){ 
       list_done.getItems().add(task); 
      }else{ 
       list_todo.getItems().add(task); 
      } 
     } 
    } 
} 

Und hier sind die fxml Dateien:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Hyperlink?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.PasswordField?> 
<?import javafx.scene.control.Separator?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.text.Font?> 

<AnchorPane prefHeight="400.0" prefWidth="500.0" style="-fx-background-color: #0288D1; -fx-border-color: #01579B; -fx-border-width: 5;" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="desktop_tasker.FXMLDocumentController"> 
    <children> 
     <Label layoutX="215.0" layoutY="34.0" text="Sign In" textFill="WHITE"> 
     <font> 
      <Font size="23.0" /> 
     </font> 
     </Label> 
     <Hyperlink fx:id="link_login" layoutX="150.0" layoutY="269.0" onAction="#handleButtonAction" text="Not registered yet? Click here." textFill="WHITE" /> 
     <TextField fx:id="et_username" layoutX="21.0" layoutY="102.0" prefHeight="25.0" prefWidth="425.0" promptText="Username" style="-fx-prompt-text-fill: #ffffff; -fx-background-color: #0288D1;" /> 
     <Separator layoutX="27.0" layoutY="126.0" prefHeight="3.0" prefWidth="425.0" /> 
     <Separator layoutX="27.0" layoutY="192.0" prefHeight="3.0" prefWidth="425.0" /> 
     <Button fx:id="btn_signup" layoutX="27.0" layoutY="222.0" mnemonicParsing="false" onAction="#handleButtonAction" prefHeight="23.0" prefWidth="425.0" style="-fx-background-color: #FFA000; -fx-prompt-text-fill: #ffffff;" text="SignUp" textFill="WHITE" /> 
     <PasswordField fx:id="et_password" layoutX="21.0" layoutY="167.0" prefHeight="25.0" prefWidth="425.0" promptText="Password" style="-fx-background-color: #0288D1; -fx-prompt-text-fill: #ffffff;" /> 
    </children> 
</AnchorPane> 

Und der andere:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.ListView?> 
<?import javafx.scene.control.Menu?> 
<?import javafx.scene.control.MenuBar?> 
<?import javafx.scene.control.MenuItem?> 
<?import javafx.scene.control.SplitPane?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="557.0" prefWidth="1012.0" style="-fx-background-color: #0288D1;" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="desktop_tasker.FXMLTaskerController"> 
    <children> 
     <SplitPane dividerPositions="0.5811881188118811" layoutX="-8.0" layoutY="35.0" prefHeight="529.0" prefWidth="1027.0" style="-fx-background-color: #EEEEEE;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="28.0"> 
     <items> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
       <children> 
        <ListView fx:id="list_todo" layoutY="-8.0" prefHeight="527.0" prefWidth="584.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> 
       </children> 
      </AnchorPane> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
       <children> 
        <ListView fx:id="list_done" layoutY="14.0" prefHeight="527.0" prefWidth="420.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> 
       </children></AnchorPane> 
     </items> 
     </SplitPane> 
     <MenuBar prefHeight="30.0" prefWidth="1012.0"> 
     <menus> 
      <Menu mnemonicParsing="false" text="File"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Close" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Edit"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Delete" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Help"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="About" /> 
      </items> 
      </Menu> 
     </menus> 
     </MenuBar> 
    </children> 
</AnchorPane> 

Wie man sehen kann ich versucht, einen Controler zu verwenden und ein Satz mit Das Problem ist, dass wenn ich die neue Szene öffne, sein Controller zurückgesetzt wird und der String nicht mehr da ist, irgendeine Idee warum oder wie man das löst?

+0

Wenn ich das tue bekomme ich diesen Fehler: Verursacht von: javafx.fxml.LoadException: Controller-Wert bereits angegeben. in der Zeile von Pane myPane = (Pane) myLoader.load(); –

+0

Es hat es behoben! Vielen Dank! –

+0

Ich bin mir ziemlich sicher, es ist JavaFX nicht JAVAFX – ice1000

Antwort

1

Wenn Sie einen Regler mit myLoader.setController(controler); festlegen möchten Sie es tun müssen, bevor Pane myPane = (Pane)myLoader.load(); aufrufen und entfernen auch fx:controller="desktop_tasker.FXMLTaskerController" von FXMLTasker.fxml, Sie sonst bekommen LoadException: Controller value already specified.

Siehe JavaDoc FXMLLoader.setController(Object controller):

Legt den Controller zugeordnet mit dem Wurzelobjekt. Der an diese Methode übergebene Wert wird als Wert des Attributs fx: controller verwendet. Diese Methode muss vor dem Laden des Dokuments aufgerufen werden, wenn Controller-Ereignishandler verwendet werden, wenn im Dokument kein fx: controller-Attribut angegeben ist.


Alternativ können Sie den Controller von FXMLLoader anfordern:

FXMLTaskerController controler = (FXMLTaskerController)myLoader.getController(); 
controler.setUser(et_username.getText()); 

Aber damit kann man nicht davon ausgehen, dass username in initialize(URL url, ResourceBundle rb) gesetzt und sollte von dort entfernt.

Verwandte Themen