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

时间:2016-09-17 15:54:01

标签: java javafx fxmlloader

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

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

<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" />

然后我从那里使用@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); } } 。 这是AnchorPane,它位于相同的主GUI fxml中。

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

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

初始化主控制器(主GUI显示整个时间)

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

此主类中的工作方法示例(从同一主FXML中的按钮调用):

rootSetPane

不起作用的方法示例(使用对象调用):

rootSetPane

我在程序中使用主GUI中的按钮多次设置第二个窗格(这样可行)。尝试从主控制器类外部设置此窗格时,会发生此问题。我不能使用Main类的实例并调用方法来访问NullPointerException(我无法使rootSetPane静态)。我得到NullPointerException。我确信这是一个业余的错误。有没有办法可以使用上面的方法更改此.offsetHeight

或者我是否必须制作其他课程来管理我的屏幕。最简单(甚至是肮脏)的解决方案将不胜感激 如果我能够在主GUI中触发按钮,它也会起作用,但这会导致同样的问题(container.style.display = "block"; // container is actually still invisible // current style hasn't been calculated container.offsetHeight; // this forces a style recalc // so the current style for the container is figured out. // without this recalc, this element effectively has no style, // and so when you transition from its current style (null) to a different one (opacity: 1), it just snaps to the new value. container.style.opacity = 1; // this triggers the transition. // because the style was recalced before the transition was triggered, // it will transition _from_ those values. )。我有一种感觉,我不能使用类的对象引用元素,我也不能使这些元素静态。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

 SpecialAnchorClass anchor = new SpecialAnchorClass();

提到在SceneBuilder中你必须检查: enter image description here

  

所以你的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
     }

}