Java 如何从同一类的实例引用同一FXML元素

Java 如何从同一类的实例引用同一FXML元素,java,javafx,fxmlloader,Java,Javafx,Fxmlloader,抱歉,我是JavaFX新手。 我的设置: 我有一个主FXML GUI,它一直显示在屏幕上。在这个主GUI中,我在AnchorPane中加载了另一个FXML 最初使用以下方法将第二个FXML加载到此AnchorPane(位于主GUI中): @FXML private AnchorPane rootSetPane; 然后从那里使用rootSetPane。 这是同一个主GUI fxml中的锚烷 <AnchorPane fx:id="rootSetPane" layoutX="228.0" pr

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

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

@FXML
private AnchorPane rootSetPane;
然后从那里使用
rootSetPane
。 这是同一个主GUI fxml中的锚烷

<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" />
此主类中的工作方法示例(从同一主FXML中的按钮调用):

方法不起作用的示例(这称为使用对象):

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

或者我必须制作其他类来管理我的屏幕。最简单(甚至最脏)的解决方案将不胜感激。

如果我能够在主GUI中启动一个按钮,它也会工作,但这会导致相同的问题(
NullPointerException
)。我有一种感觉,我不能使用类的对象引用元素,也不能使这些元素保持静态

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

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

您可以创建一个扩展
ancorpane
的类。该类将是fxml的控制器。因此,您可以创建它的实例,如:

 SpecialAnchorClass anchor = new SpecialAnchorClass();
提到在SceneBuilder中,您必须检查:

所以你的特别课程是这样的:


您可以创建一个扩展
AnchorPane
的类。该类将是fxml的控制器。因此,您可以创建它的实例,如:

 SpecialAnchorClass anchor = new SpecialAnchorClass();
提到在SceneBuilder中,您必须检查:

所以你的特别课程是这样的:


文件名是正确的。但是“rootSetPane”发生错误(与上面的错误相同)。这行不行:“rootSetPane.getChildren()”。如何初始化
rootSetPane
?我想这个问题的答案是否定的。我使用主gui控制器的对象从另一个类调用了方法。如何以另一种方式调用此方法(或正确地调用它?)。文件名是正确的。但是“rootSetPane”发生错误(与上面的错误相同)。这行不行:“rootSetPane.getChildren()”。如何初始化
rootSetPane
?我想这个问题的答案是否定的。我使用主gui控制器的对象从另一个类调用了方法。我怎样才能以另一种方式调用这个方法(或正确地调用它?)。我什么时候才能按照程序的顺序创建这个类的对象?@lolftw您可以将它创建为主类的一个成员,或者您可以随时创建它,并使它成为静态的最终对象。正如我提到的,我对这个完全陌生,我认为我实现这个错误。我收到以下错误:
javafx.fxml.LoadException:Root尚未设置。在加载之前使用方法setRoot()。
@lolftw是的,这就是为什么要添加映像。您必须检查[Use fx:root Construction]。您是如何创建fxml的?@lolftw请看这里,我什么时候才能按照程序的顺序创建此类的对象?@lolftw您可以将其创建为主类的成员,或者你可以在任何时候创建它,并使其成为静态的最终结果。正如我提到的,我对这一点完全陌生,我认为我实现这一点是错误的。我收到以下错误:
javafx.fxml.LoadException:Root尚未设置。加载前使用方法setRoot()。
@lolftw是的,这就是添加图像的原因。您必须检查[Use fx:root构造]。您是如何制作fxml的?@lolftw请查看此处
public void setPanel() throws IOException {
   AnchorPane newPane = FXMLLoader.load(getClass().getResource("NewPane.fxml"));
rootSetPane.getChildren().setAll(newPane);  
}
 SpecialAnchorClass anchor = new SpecialAnchorClass();
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
     }

}