我在使用SceneBuilder及其相关控制器创建的fxml文件中有一个主要的gui。 在那个主要的gui我有一个网格窗格,我想为每个单元格放置三个子节点(标签,TextView和CheckBox)。 所以我创建了一个额外的fxml,其中HBox是root用户和三个孩子。
现在......我如何通过代码在主gui的gridpane中添加每个单元格的定义组件并与它们交互?
我的意思是......在主gui控制器中我想做的是这样的事情:
for(int i) for(int j) gridpane.add(" the_composed_view_in_the_other_fxml",i,j)
答案 0 :(得分:1)
如果我正确理解了您的问题,您可以在" main"的initialize
方法中执行此类操作。控制器:
public class MainController {
@FXML
private GridPane gridpane ;
public void initialize() throws IOException {
int numCols = ... ;
int numRows = ... ;
for (int rowIndex = 0 ; rowIndex < numRows ; rowIndex++) {
for (int colIndex = 0 ; colIndex < numCols ; colIndex++) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/addtional/fxml"));
gridpane.add(loader.load(), colIndex, rowIndex);
}
}
}
}
对于&#34;互动&#34;使用从附加fxml文件加载的组件,控制器实际上负责额外的fxml。加载fxml文件后,您可以获得对每个控制器的引用:
gridpane.add(loader.load(), colIndex, rowIndex);
AdditionalController controller = loader.getController();
然后您可以调用在该控制器类中定义的方法。你还没有真正提供关于你可能想要做什么的详细信息,但是,例如:
public class AdditionalController {
@FXML
private CheckBox checkBox ;
public BooleanProperty selectedProperty() {
return checkBox.selectedProperty();
}
// etc...
}
然后像
gridpane.add(loader.load(), colIndex, rowIndex);
AdditionalController controller = loader.getController();
String s = String.format("Item [%d, %d]", colIndex, rowIndex);
controller.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
// process selection...
System.out.println(s + " is selected");
}
});