我有一个主类(Main.java),两个FXML文件(FXML1.fxml,FXML2.fxml)和相应的控制器(FXML1Controller.java,FXML2Controller.java) .

在FXML1.fxml中我有两个文本字段和两个按钮 . 在关联的控制器(FXML1Controller.java)中,我已经声明了文本字段和按钮,如下所示:

public TextField textField1;
public TextField textField2;

public Button buttonchange;
public Button buttonOpenWindow;

public void open ()
{
...
     stage.show ();

}
public void change ()
{
    textField2.setText (textField1.getText ());
}

我在textField1中键入文本 . 当我单击buttonChange时,应该在textfield2中设置文本 . 作品 . 这很简单 . 当我单击buttonOpen时,将打开一个新窗口 . 在那里,我只有一个按钮,但想要做同样的事情 . 所以像这样的方式:

public void changeFromHere ()
{
      FXMLController1 c1 = new FXMLController1 ();
    c1.change ();
}

我也知道这里有类似的问题 . 但不知何故,它不能按我想要的方式工作 .

我总是得到一个NullPointerException . 当然 . 我知道 . 所以我做了以下事情:

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
...
public class FXML2Controller implements Initializable
{

    ...



     public Button buttonChangeFromHere;


     URL location;
     FXMLLoader fxmlLoader;
     Pane root;
     FXMLController1 fc1;


     public voidChangeFromHere ()
     {
         fc1.change ();
     }
     @Override
     public void initialize (URL url, ResourceBundle rb)
     {
         try
         {
             location = getClass ().getResource ("FXML1.fxml");
             fxmlLoader = new FXMLLoader (location);
             root = (Pane) fxmlLoader.load ();
             fc1 = (FXMLController1) fxmlLoader.getController ();
         } catch (IOException ex)
         {
             Logger.getLogger (FXML2Controller.class.getName ()) .log (Level.SEVERE, null, ex);
         }
     }
...
}

现在我无法获得NullPointerException,它应该以这种方式工作 . 但什么都没发生!

如果我用于测试System.out.println(fc1.textField2.getText());,那么我得到文本“Hello”,我在JavaFXSceneBuilder中定义了它 . 如果我删除SceneBuilder中的文本,那么我得到“null” . 当然 . 同样,当我在程序运行时输入术语“Hello”(在textField1中)时,我得到“null” . 我还尝试在initialize方法中首先初始化文本字段 . 然后我也总是得到文本“你好”,虽然我输入了“Byebye” .

这个论坛中类似问题的解决方案无法帮助我 . 这就是我再次提出类似问题的原因 . 这段代码也只是一个例子 . 我不能在这里粘贴我的整个代码 . 我真正想做的是:在我的程序中我有一个列表(listView) . 在列表中是我保存为文件的文件的路径 . 工作正常(在主控制器,Main.fxml) . 在那里,我有一个方法public void save() . 现在我想从另一个控制器类调用save()方法 . 但几乎所有变量都是“空” . 但它们不能是“空”,因为listView向我显示了这些信息 . 我不认为getter和setter方法是合适的,因为它将是非常冗余的代码 . 我不希望这样 . 如果有人能够回答如何使用示例中的文本字段来解决问题,那么我将不胜感激 . 如果它不适用于文本字段,它也不能与其他组件一起使用:-( . 提前谢谢 .