JavaFx无法将文本强制转换为文本字段,也无法将文本字段强制转换为文本?

JavaFx无法将文本强制转换为文本字段,也无法将文本字段强制转换为文本?,java,javafx,casting,Java,Javafx,Casting,我正在尝试为我的Java类做一个应用程序。我们主要是在学习如何使用github,但我的问题来自JavaFX。我假设在几个窗格和场景上创建一个表单,在最后一个窗格和场景上,当用户点击submit时,TextFields内容应该放在一个文件中 我的想法是将文本字段传递到最后一个有参数的窗格中,并在按下submit按钮后创建一个bufferedwriter,将所有文本添加到一个新文件中。因此,这个想法非常有效,我通过了一个窗格,因为所有文本字段都在一个VBox中,当我编写它们时,我将它们转换为文本字段

我正在尝试为我的Java类做一个应用程序。我们主要是在学习如何使用github,但我的问题来自JavaFX。我假设在几个窗格和场景上创建一个表单,在最后一个窗格和场景上,当用户点击submit时,TextFields内容应该放在一个文件中

我的想法是将文本字段传递到最后一个有参数的窗格中,并在按下submit按钮后创建一个bufferedwriter,将所有文本添加到一个新文件中。因此,这个想法非常有效,我通过了一个窗格,因为所有文本字段都在一个VBox中,当我编写它们时,我将它们转换为文本字段,但当我运行它时,它告诉我文本不能转换为文本字段,所以当我尝试转换为文本时,它会告诉我相反的结果!该文本字段不能转换为文本!我用代码中的textArea尝试了缓冲区,效果很好!我不明白为什么不使用我经过的窗格

注意:就在最后,我尝试连接到一个字符串,看看缓冲区是否有问题,但它告诉我同样的错误,即使这样做

代码如下:

    public class RulesPane extends VBox{
    public RulesPane(Stage mainStage, Scene mainScene, Pane pane) {
        this.setAlignment(Pos.TOP_CENTER);

        BackgroundImage background = new BackgroundImage(new Image("water.png",900,600,false,true), 
                BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT,
                  BackgroundSize.DEFAULT);
        this.setBackground(new Background(background));

        File logoPath = new File("src/swimclub_Logo.png");
        Image logoImage = new Image(logoPath.toURI().toString());
        ImageView logo = new ImageView(logoImage);

        TextArea agreement = new TextArea();
        agreement.setEditable(false);
        agreement.setPrefHeight(400);
        agreement.setMaxWidth(600);
        agreement.setWrapText(true);
        agreement.setText("This is text");

        CheckBox agree = new CheckBox("I Agree");

        HBox buttons = new HBox();
        buttons.setPadding(new Insets(50, 0, 0, 60));
        buttons.setSpacing(300);

        Button back = new Button();
        back.setText("Back");
        back.setOnMouseClicked(e->{
            mainStage.setScene(mainScene);
        });

        Button exit = new Button();
        exit.setText("Exit");
        exit.setOnMouseClicked(e->{
            Platform.exit();
        });

        Button submit = new Button();
        submit.setText("Submit Form");
        submit.setDisable(true);
        submit.setOnMouseClicked(e->{
            File file = new File("user_info.txt");
            try {
                BufferedWriter out = new BufferedWriter(new FileWriter(file));
                String contentToSave = "";
                for(int i = 0; i < pane.getChildren().size(); i++) 
                    contentToSave += ( (TextField) pane.getChildren().get(i)).getText();

                out.write(contentToSave);
                out.flush();
                out.close();
            } catch (IOException e1) {

                e1.printStackTrace();
            }
        });


        //CheckBox event handler to make the submit button available or unavailable when pressed
        agree.setOnAction(e->{
            if(agree.isSelected()) 
                submit.setDisable(false);
            else
                submit.setDisable(true);
        });

        buttons.getChildren().addAll(back, exit, submit);
        this.getChildren().addAll(logo , agreement, agree, buttons);
        }
}

因为我看不到窗格的确切来源,所以我假设当你说在VBox中有文本字段时,VBox就在该窗格中。如果是这样,问题看起来像是您将文本字段强制转换为窗格,而不是将文本字段强制转换为窗格的子项,如果它位于VBox中,您无论如何都希望得到它的(VBox)子项。因此:

  for (int i = 0; i < pane.getChildren().size(); i++) {
     Node child1 = group.getChildren().get(i);
     if (child1 instanceof VBox) {
         for(Node child2:((VBox) child1).getChildren()) {
             if (child2 instanceof TextField) {
                 contentToSave += (TextField) child2.getText();
             }
          }
      }
   }
for(int i=0;i
与尝试将窗格变成文本字段的try块中的for循环不同,这将获取窗格的子项,假设它们是vbox(如果是),然后获取vbox的子项,并假设它们是TextFields(如果是)


如果这还不行,我建议发布您的其余代码(窗格来自何处)以及它抛出的错误。

让我澄清一下:您将整个文本字段写入一个文本文件?那可不行。只在这样的任务中使用字段的文本。是的,这是我使用getText()方法的方式,这样我就可以在内部使用文本,但它会给我带来错误请使用一个最小的可运行程序,我们可以自己尝试,而不丢失方法或自定义类,不仅上面的代码是不完整的,而且您还有一些错误,比如您使用参数(Stage、Scene、String)调用的构造函数或rulespan,它的定义是(Stage、Scene、Pane),此外,我不知道RulesScene是关于什么的。试着用一个小例子来重现您的问题,这样做时,您可能会发现错误的类型。您说您的
TextField
s位于
VBox
中,但您有
(TextField)窗格…
?显示您的
堆栈跟踪
,并指出引发错误的代码行。我传递的是一个VBox窗格。其余的代码是不需要的,因为我尝试在类中执行它,其中VBox和TextFields被实例化只是为了测试目的,它抛出了相同的错误。不是说你应该把它放在代码的其他部分,以便理解这里发生了什么(你试图使用的窗格中是什么)看看它来自哪里会很有帮助。好吧,我添加了它的字符串contentToSave=“”;和新规则(初级阶段、场景、内容保存);,您正在尝试使用字符串而不是窗格创建RulesPane(舞台、场景、窗格)。将构造函数更改为具有字符串,或者尝试改用字符串[],因为您正在存储多个字符串
  for (int i = 0; i < pane.getChildren().size(); i++) {
     Node child1 = group.getChildren().get(i);
     if (child1 instanceof VBox) {
         for(Node child2:((VBox) child1).getChildren()) {
             if (child2 instanceof TextField) {
                 contentToSave += (TextField) child2.getText();
             }
          }
      }
   }