当前位置: 首页 > 知识库问答 >
问题:

无法在场景之间传递属性JAvaFX

常英毅
2023-03-14

我试图在JavaFX中的场景之间传递一个字符串,我已经遵循了一些答案,但似乎它们不起作用,因为字符串在新场景中是空的。

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);
            }
        }
    }
}
<?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个答案

易淳
2023-03-14

如果要用myloader.setcontroller(controler)设置控制器;必须在调用Pane myPane=(Pane)myloader.load();之前执行此操作,并从fxmltasker.fxml中删除fx:Controller=“desktop_tasker.fxmltaskercontroller”,否则将得到一个loadexception:Controller值。

参见JavaDocfxmlloader.setController(对象控制器):

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

或者,您可以从fxmlloader请求控制器:

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

但是,因此,您不能假定usernameinitialize(URL URL,ResourceBundle rb)中设置了并且应该从那里删除。

 类似资料:
  • 我尝试了几乎所有可用的解决方案,但似乎都不起作用我需要在两个Javafx场景之间传递,但当我单击以导航到下一个场景时,什么也没有发生。以下是我目前为止的代码:

  • 我创建了一个游戏,我想给它添加一个开始屏幕,我使用FXML添加了它,还添加了两个按钮(开始和退出)。 按下开始按钮后,我希望游戏加载场景并切换到游戏开始。我对如何做有一个粗略的想法,但我有点挣扎,因为我的SampleController类不知道如何启动游戏等,因为所有代码(以及加载初始开始菜单的代码)都在我的主类中,所以我尝试了这样的事情: 我尝试使用一个函数来切换场景,但它不起作用,也试图使用获

  • 我在class1中创建了一个场景,然后在Class2中创建了一个scene2。如何在两者之间切换? 这是第二节课,我有另一个场景。

  • 我希望使用Groovy在SOAPUI中执行以下操作: 我在internet上发现一些帖子建议使用groovy属性 但我觉得对我来说还不够。 我希望能够通过以下方式将映射传递到Testcase2: 提前致谢

  • 尽管我已经编写单元测试20多年了,但我对Gherkin还是新手,并且还被赋予了为一个。feature文件实现故事的任务,该文件可以简化为以下内容: 也就是说,一个很长很长的场景链,每个场景都依赖于由其前身配置的系统状态。 我在JavaScript中运行Cucumber。

  • 我正在做java fx,我陷入了将变量传递到不同的FXML场景中。因此在第一个场景控制器上,LoginController与login.fxml相关联 当新场景打开时,我需要根据包含用户输入的username变量设置标签。这意味着我们需要通过controoler将变量从login.fxml传递到mainscreen.fxml。我如何实现这一点?