试图找到一种方法从中央窗格控制器上在“边界窗格”上调用setCenter方法

问题描述

当前,我有一个主控制器,该控制器控制将元素添加到边框窗格的左侧窗格中以进行导航,并控制中心窗格中的内容。我还使用fx:root加载新的FXML布局,每个布局都有一个单独的控制器进入Border Pane的中央窗格。尝试从中央窗格控制器调用MainController的setCenter方法时,我的中央窗格未更新。我猜测新创建的控制器未与主控制器中的mainPane关联。如何关联它们?

主密码器

这将使用任一按钮在中央和左侧窗格中加载适当的视图和关联的控制器。

    public class MainController {

    @FXML
    BorderPane mainPane;
    @FXML
    Button orderBtn,adminBtn;
    @FXML
    static
    Label statusTxt;

    public void initialize(){

        orderBtn.setOnAction(event -> {
           setCenter(new ControllerConnector("/view/OrderView.fxml"));
           setNav(new ControllerConnector("/view/OrderNav.fxml"));
        });

        adminBtn.setOnAction(event -> {
           setCenter(new ControllerConnector("/view/ProductView.fxml"));
           setNav(new ControllerConnector("/view/AdminNav.fxml"));
        });

    public static void updateStatus(String string) {
        statusTxt.setText(string);
    }

    public void setCenter(ControllerConnector connector){
        this.mainPane.setCenter(connector);
    }

    public void setNav(ControllerConnector connector){
        this.mainPane.setLeft(connector);
    }
}

产品负责人

搜索功能在此控制器中起作用,该控制器已从关联的视图加载,因此我知道控制器已初始化。单击newBtn后,什么也不会发生。

public class ProductController {
    @FXML
    TableView<Product> productTable;
    @FXML
    TableColumn prodCol,sizeCol,categoryCol,priceCol;
    @FXML
    TextField searchTxt;
    @FXML
    Button searchBtn,newBtn,editBtn,deleteBtn;

    public void initialize() throws SQLException {
        ObservableList<Product> products = ProductDAO.getProducts();
        prodCol.setCellValueFactory(new PropertyValueFactory<Product,String>("name"));
        sizeCol.setCellValueFactory(new PropertyValueFactory<Product,String>("size"));
        priceCol.setCellValueFactory(new PropertyValueFactory<Product,Double>("price"));
        categoryCol.setCellValueFactory(new PropertyValueFactory<Product,String>("category"));
        productTable.setItems(products);

        searchBtn.setOnAction(event -> {
            ObservableList<Product> searchProducts = FXCollections.observableArrayList();
            String searchString = searchTxt.getText();
            for (Product product : products) {
                if(product.getName().contains(searchString) || product.getSize().contains(searchString)){
                    searchProducts.add(product);
                }
            }
            products.removeAll(products);
            products.addAll(searchProducts);

        });

        searchTxt.setOnMouseClicked(event -> {
            products.removeAll(products);
            try {
                products.addAll(ProductDAO.getProducts());
            } catch (SQLException exception) {
                exception.printStackTrace();
            }
        });

        newBtn.setOnAction(event -> {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/MainView.fxml"));
            try {
                loader.load();
            } catch (IOException e) {
                e.printStackTrace();
            }
            MainController mainController = loader.getController();
            mainController.setCenter(new ControllerConnector("/view/NewProductView.fxml"));
        });
    }
}

ControllerConnector

使用此类创建一个Node,以传递到Border Pane设置方法中。

public class ControllerConnector extends GridPane {

    public ControllerConnector(String fxmlPath){
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fxmlPath));
        fxmlLoader.setRoot(this);
        try{
            fxmlLoader.load();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...