无法通过场景JAvaFX传递属性

时间:2017-11-28 10:58:53

标签: java javafx

我正在尝试在JavaFX中的场景之间传递一个字符串,我已经跟随some answers但似乎它们不起作用,因为新场景中的字符串为空。

这是我的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
    }    

}

这是另一个类控制器,我想要我的字符串。

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

以下是fxml文件:

<?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>

另一个:

<?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>

正如你所看到我试图使用一个控制器并使用一个设置字符串的集合,问题是当我打开新场景时,他的控制器重置并且字符串不再存在,任何想法为什么或如何解决此?

1 个答案:

答案 0 :(得分:1)

如果您想使用myLoader.setController(controler);设置控制器,则必须在调用Pane myPane = (Pane)myLoader.load();之前执行此操作,并从fx:controller="desktop_tasker.FXMLTaskerController"移除FXMLTasker.fxml,否则您将获得LoadException: Controller value already specified. }

参见JavaDoc FXMLLoader.setController(Object controller)

  

设置与根对象关联的控制器。传递给此方法的值用作fx:controller属性的值。在文档中未指定fx:controller属性时,在使用控制器事件处理程序时,必须在加载文档之前调用此方法。

或者,您可以从FXMLLoader

请求控制器
 FXMLTaskerController controler = (FXMLTaskerController)myLoader.getController();
 controler.setUser(et_username.getText());

但是你不能假设username中设置initialize(URL url, ResourceBundle rb)并且应该从那里删除。