JavaFX-向fxml创建的VBox动态添加按钮
我试图在滚动窗格中的VBox中添加x个按钮。 Vbox和scrollpane是用scenebuilder制作的 但是,我似乎无法将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如
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