我有一个主类(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"。当然。同样,我得到" null"当我输入术语"你好"程序运行时(在textField1中)。 我还尝试在initialize方法中首先初始化文本字段。然后我也总是得到文字"你好",虽然我输入" Byebye"。
本论坛中类似问题的解决方案无法帮助我。 这就是我再次提出类似问题的原因。 这段代码也只是一个例子。我不能在这里粘贴我的整个代码。我真正想做的是: 在我的程序中,我有一个列表(listView)。 在列表中是我保存为文件的文件的路径。工作正常(在主控制器,Main.fxml)。在那里,我有一个方法public void save()。现在我想从另一个控制器类调用save()方法。但几乎所有变量都是" null"。 但是他们不能" null&#34 ;,因为listView向我显示了这些信息。 我不认为getter和setter方法是合适的,因为它将是非常冗余的代码。我不想要那个。 如果有人可以回答如何使用示例中的文本字段来解决问题,那么我将不胜感激。 如果它不适用于文本字段,它也不能与其他组件一起使用:-(。 提前谢谢。