试图找到一种方法从中央窗格控制器上在“边界窗格”上调用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();
        }
    }
}
iCMS 回答:试图找到一种方法从中央窗格控制器上在“边界窗格”上调用setCenter方法

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1699504.html

大家都在问