如何从相同 class 的实例中引用相同的 FXML 元素

How can I reference the same FXML element from an instance of the same class

抱歉,我是 JavaFX 的新手。 我的设置: 我有一个主要的 FXML GUI,它一直显示。在这个主 GUI 中,我在 AnchorPane 中加载了另一个 FXML。

第二个 FXML 最初使用以下方式加载到此 AnchorPane(位于主 GUI 中):

@FXML
private AnchorPane rootSetPane;

然后我从那里使用 rootSetPane。 这是位于同一主 GUI fxml 中的 AnchorPane。

<AnchorPane fx:id="rootSetPane" layoutX="228.0" prefHeight="710.0" prefWidth="887.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="228.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />

初始化主控制器(始终显示主 GUI)

@Override
public void initialize(URL url, ResourceBundle rb) {
    AnchorPane paneHome;
    try {
        paneHome = FXMLLoader.load(getClass().getResource("HomePage.fxml"));
        rootSetPane.getChildren().setAll(paneHome);          
    } catch (IOException ex) {
        Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

此主程序中的工作方法示例 class(这是从同一主程序 FXML 中的按钮调用的):

@FXML
private void foodFinder(ActionEvent event) throws IOException {      
    AnchorPane paneFoodFinder = FXMLLoader.load(getClass().getResource("ScreenFoodFinder.fxml"));

    rootSetPane.getChildren().setAll(paneFoodFinder);    
}

无效方法示例(使用对象调用):

public void setPanel() throws IOException {
   AnchorPane newPane = FXMLLoader.load(getClass().getResource("NewPane.fxml"));
rootSetPane.getChildren().setAll(newPane);  
}

我在程序中使用主 GUI 中的按钮多次设置了第二个窗格(这有效)。尝试从主控制器外部设置此窗格时会出现问题 class。我不能使用 Main class 的实例并调用方法来访问 rootSetPane(而且我不能使 rootSetPane 静态化)。我收到 NullPointerException。我确信这是一个业余错误。有没有一种方法可以使用上述方法来更改此 rootSetPane

或者我是否必须创建其他 classes 来管理我的屏幕。最简单(甚至是脏)的解决方案将不胜感激。
如果我能够在主 GUI 中触发一个按钮,它也会起作用,但这会导致同样的问题 (NullPointerException)。我有一种感觉,我不能使用 class 的对象来引用元素,而且我也不能使这些元素成为静态的。

检查 getClass().getResource("NewPane.fxml") 是否指向正确的文件。

你可以创建一个扩展 AnchorPane 的 class。class 将成为 fxml.So 的控制器,你可以创建它的实例,例如:

 SpecialAnchorClass anchor = new SpecialAnchorClass();

提到在 SceneBuilder 中你必须检查:

So your SpecialAnchorClass will be like this:

public class SpecialAnchorClass extends AnchorPane implements Initializable{

    //..@fxml nodes

    /**
     * Constructor
     */
   public SpecialAnchorClass(){
         //FXMLLOADER
        FXMLLoader loader = new FXMLLoader(getClass().getResource("..path to fxml file"));
        loader.setController(this);
        loader.setRoot(this);

        try {
            loader.load();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

   @Override
     public void initialize(URL location, ResourceBundle resources) {


           //when this method is called every fxml component has been initialized
     }

}