java - 如何从多个嵌套 FXML 获取数据并调用其 Controller 上的方法

标签 java javafx javafx-8 javafx-2

这是我的项目的样子:

Main.FXML

  • 锚定 Pane
    • VBox [鸡蛋容器] id="_eggContainer"
    • 按钮 [Add Egg] --> 将 EggView 添加到 _eggContainer
    • 按钮 [Print Eggs] --> 打印所有鸡蛋的属性
    • 按钮[Break Eggs] --> 对每个鸡蛋调用break方法

EggView.FXML

  • HBox
    • 标签:[Egg ID] 每次实例化 EggView 时都应递增
    • 文本字段:[鸡蛋颜色]

MainController.java

public class MainController implements Initializable {   

    /***CONTROLS***/
    @FXML private VBox   _eggsContainer;
    @FXML private Button _btnAddEgg;
    @FXML private Button _btnPrintEggs;
    @FXML private Button _btnBreakEggs;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        _btnAddEgg.setOnMouseClicked(e -> {
            doAddEgg();
        });
        _btnPrintEggs.setOnMouseClicked(e -> {
            doPrintAllEggs();
        });
        _btnBreakEggs.setOnMouseClicked(e -> {
            doBreakAllEggs();
        });
    }

    // Add an egg to _eggsContainer
    private void doAddEgg() {
        HBox eggControl = null;
        try {
            eggControl = FXMLLoader.load(getClass().getResource("EggView.fxml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        _eggsContainer.getChildren().add(eggControl);
    }

    private void doPrintAllEggs() {
        // prints ID and Color of each egg in _eggsContainer
    }

    private void doBreakAllEggs() {
        // call the break method in EggController controller on each egg
    }
}

EggController.java

public class EggController {

    /***CONTROLS***/
    @FXML private Label _eggID;
    @FXML private TextField _eggColor;

    public void doBreakEgg() {
        // TODO: Break Egg
    }

    /****************************************************************
     **********                  ACCESSORS               ************
     ****************************************************************/
    public String getEggID() {
        return _eggID.getText();
    }

    public String setEggID(String id) {
        return _eggID.setText(id);
    }

    public String getEggColor() {
        return _eggColor.getText();
    }

}

现在我如何从主 Controller 访问每个鸡蛋数据和方法?无需为每个鸡蛋提供 ID 并在 MainController 中引用它。

最佳答案

加载EggView.fxml时从FXMLLoader获取 Controller ,并将它们放入列表中。 (顺便说一句,不要使用鼠标监听器来处理按钮操作。)

public class MainController implements Initializable {   

    /***CONTROLS***/
    @FXML private VBox   _eggsContainer;
    @FXML private Button _btnAddEgg;
    @FXML private Button _btnPrintEggs;
    @FXML private Button _btnBreakEggs;

    private final List<EggController> eggs = new ArrayList<>();

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        _btnAddEgg.setOnAction(e -> {
            doAddEgg();
        });
        _btnPrintEggs.setOnAction(e -> {
            doPrintAllEggs();
        });
        _btnBreakEggs.setOnAction(e -> {
            doBreakAllEggs();
        });
    }

    // Add an egg to _eggsContainer
    private void doAddEgg() {
        HBox eggControl = null;
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("EggView.fxml"));
            eggControl = loader.load();
            EggController controller = loader.getController();
            eggs.add(controller);
        } catch (IOException e) {
            e.printStackTrace();
        }
        _eggsContainer.getChildren().add(eggControl);
    }

    private void doPrintAllEggs() {
        // prints ID and Color of each egg in _eggsContainer
        for (EggController controller : eggs) {
            System.out.println(controller.getEggId() + " : " + controller.getEggColor());
        }
    }

    private void doBreakAllEggs() {
        eggs.forEach(EggController::doBreakEgg);
    }
}

关于java - 如何从多个嵌套 FXML 获取数据并调用其 Controller 上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48130279/

相关文章:

java - JTable fireDataChanged 重复单元格值

java - 如何在 Mongo 中取消设置嵌套对象图并在投影中公开特定的对象图深度

JavaFX TextArea appendText CPU 使用率高

JavaFX 8 Spinner 控件不更新显示的值

商业产品中的 JavaFX

java - 对数组列表中的元素进行总计

java - 如何重置ImageView的位置?

JavaFX : How to dynamically change the controller in the same fxml file?

java - 我可以在项目的资源文件夹中看到图像,但仍然收到无效网址错误

java - 为什么 JavaFx SceneBuilder 找不到用户定义的类?