我想在VBox中添加一个自定义元素。
例如:能够编写VBox.getChildren().add(element)
和element
是我在FXML中创建的自定义节点。
我已经遵循了本教程:https://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm
但是这个例子只显示了如何在同一个控制器内执行此操作(单个控制器,我已经有了我的“大”控制器,即WinnerController
,我想拆分两个类,一个管理单个元素,以及管理整个场景Winner.fxml
)的那个。
我已经有一个班级WinnerController
,它是我的FXML Winner.fxml
的控制者。
这是我Winner.fxml
的代码:
<AnchorPane id="paneWinner" fx:id="paneWinner" prefHeight="800.0" prefWidth="1280.0" stylesheets="@winner.css" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="client.gui.WinnerController">
<children>
<VBox layoutX="434.0" layoutY="125.0" prefHeight="250.0" prefWidth="413.0" spacing="10.0">
<children>
<AnchorPane id="leaderBoardElement" prefHeight="80.0" prefWidth="413.0" stylesheets="@leaderBoard.css">
<children>
<Text layoutX="49.0" layoutY="45.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" wrappingWidth="107.13671875" />
</children></AnchorPane>
</children>
</VBox>
我想动态地将带有id“leaderBoardElement”的元素(所以一个AnchorPane + Text)添加到我的VBox中。
我该怎么做?
修改:我也试过这个解决方案:How to understand and use `<fx:root>` , in JavaFX?
但我一无所获。当我在vbox.getChildren().add(new MyComponent());
中WinnerController
打电话时,我什么都没得到。
WinnerController类:
public class WinnerController implements Initializable {
@FXML
private VBox leaderBoard;
@FXML
public void initialize(URL location, ResourceBundle resources) {
System.out.println("Winner Init");
MyComponent test = new MyComponent();
System.out.println(test);
// leaderBoard.getChildren().add(new MyComponent());
}
}
我的组件类:
public class MyComponent extends AnchorPane {
@FXML
private TextField textField ;
@FXML
private Button button ;
public MyComponent() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("MyComponent.fxml"));
loader.setController(this);
loader.setRoot(this);
loader.load();
textField.setText("HELLO!");
} catch (IOException exc) {
// handle exception
System.out.println("ELEMENT NOT CREATE!!!");
}
}
}
Winner.fxml:
<AnchorPane id="paneWinner" fx:id="paneWinner" prefHeight="800.0"
prefWidth="1280.0" stylesheets="@winner.css" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="client.gui.WinnerController">
<children>
<VBox fx:id="leaderBoard" layoutX="434.0" layoutY="125.0" prefHeight="250.0" prefWidth="413.0" spacing="10.0" />
MyComponent.fxml:
<fx:root type="javafx.scene.layout.AnchorPane" fx:id="leaderBoardElement" id="leaderBoardElement">
<TextField fx:id="textField" />
<Button fx:id="button" />
我打电话给另一个类创建和加载Winner.fxml
:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/Winner.fxml"));
if (loader!=null)
System.out.println("LOADER NOT NULL!!");
try{
System.out.println("TRY!");
Parent root = (Parent) loader.load();
if(root!=null)
System.out.println("ROOT NOT NULL!!");
Scene startedGame = new Scene(root, 1280, 800, Color.WHITE);
if(startedGame!=null)
System.out.println("SCENE NOT NULL!");
Stage window = (Stage) paneCarta0.getScene().getWindow();
if (window!=null)
System.out.println("WINDOW NOT NULL!!");
window.setScene(startedGame);
window.show();
catch (IOException Exception) {
System.out.println("View not found. Error while loading");
}
问题出在new MyComponent()
内部,可能我得到一个异常,它传播到我的主调用者。我已经尝试了一切,但我无法弄清楚为什么它无法创建MyComponent
对象。
答案 0 :(得分:1)
如果您的自定义组件位于单独的FXML文件中,则可以执行此操作。
在WinnerController
课程中:
@FXML
private void initialize() throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getRessource("customElement.fxml"));
fxmlLoader.setController(new CustomElementController()); //Or just specify the Controller in the FXML file
myVBox.getChildren().add(fxmlLoader.load());
}
编辑:在此解决方案中,主fxml
中应该没有<fx:include>
个标签