JavaFX-向fxml创建的VBox动态添加按钮

JavaFX-向fxml创建的VBox动态添加按钮,java,javafx,fxml,Java,Javafx,Fxml,我试图在滚动窗格中的VBox中添加x个按钮。 Vbox和scrollpane是用scenebuilder制作的 但是,我似乎无法将VBox作为变量连接到控制器 生成场景的代码如下所示: Stage stage = MyMain.stage; stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("/main/fxml/catEdit.fxml")))); stage.show(); 我的FXML如

我试图在滚动窗格中的VBox中添加x个按钮。 Vbox和scrollpane是用scenebuilder制作的

但是,我似乎无法将VBox作为变量连接到控制器

生成场景的代码如下所示:

    Stage stage = MyMain.stage;
    stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("/main/fxml/catEdit.fxml"))));
    stage.show();
我的FXML如下:

    <?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<BorderPane maxHeight="-Infinity"
            maxWidth="-Infinity"
            minHeight="-Infinity"
            minWidth="-Infinity"
            prefHeight="400.0"
            prefWidth="600.0"
            xmlns="http://javafx.com/javafx/8.0.111"
            xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="main.controllers.CatEditCon">
   <center>
      <ScrollPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
        <content>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="200.0">
               <children>
                  <VBox fx:id="catBox" alignment="CENTER" prefHeight="200.0" prefWidth="100.0" />
               </children></AnchorPane>
        </content>
      </ScrollPane>
   </center>
</BorderPane>

控制器是:

package main.controllers;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import main.MyMain;
import main.database.master.Category;
import main.fxml.custom.CatBut;


public class CatEditCon{

    @FXML public VBox catBox;

    public CatEditCon(){

        catBox = new VBox();
        updateScroll();
    }

    public void updateScroll(){

        Category cat = MyMain.baseData.getCategories();
        System.out.println(catBox);

        int len  = MyMain.baseData.getArticles().size();
        for(int i = 0 ; i < len; i++ ){

            System.out.println(""+i);

            Button b = new Button();
            catBox.getChildren().add(b);
        }
    }
}
package main.controllers;
导入javafx.fxml.fxml;
导入javafx.scene.control.Button;
导入javafx.scene.layout.VBox;
导入main.MyMain;
导入main.database.master.Category;
导入main.fxml.custom.CatBut;
公共类CatEditCon{
@FXML公共VBox猫箱;
公共CatEditCon(){
catBox=新的VBox();
updateScroll();
}
public void updateScroll(){
Category cat=MyMain.baseData.getCategories();
系统输出打印LN(catBox);
int len=MyMain.baseData.getArticles().size();
对于(int i=0;i
关于我做错了什么有什么建议吗? 场景将打开,sysout将按其应有的顺序向上计数。但是没有按钮出现?
如果catBox未在构造函数中初始化,我将获得该对象的nullPionter。因此,就好像我没有建立到fxml对象的连接。

Implement
initializable
。创建控制器时,@FXML值不会被注入。您必须将启动时需要FXML值的所有代码都放在接口的
initialize
方法中。我以前也尝试过这个接口。如果我做:@Override public void initialize(URL位置,ResourceBundle资源){catBox=new VBox();}我在这一行得到一个nullPointerException:
catBox.getChildren().add(b)您不必创建新的VBox。它在你的FXML里,不是吗?等待FXMLLoader将VBox注入控制器。完成后,将调用initialize方法,您可以添加不初始化注入字段的按钮。不要尝试在构造函数中使用注入的字段。使用这里描述的方法之一:它起作用了!太好了,非常感谢你的回退。我认为initialize是用来将fxml连接到控制器的,而不是说它只在那时准备好了。几小时的挫折已经过去了-D