java—正在尝试从中心窗格控制器调用边框窗格上的setcenter方法

7nbnzgx9  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(143)

目前,我有一个主控制器,它控制向边框窗格的左窗格添加元素以进行导航,并向中心窗格添加内容。我还使用fx:root加载新的fxml布局,每个布局都带有一个单独的控制器,并将其放入边框窗格的中心窗格中。尝试从中心窗格控制器调用主控制器的setcenter方法我的中心窗格未更新。我猜新创建的控制器没有与主控制器中的主窗格相关联。如何将它们关联起来?
主ctonroller
这将使用任意一个按钮加载具有相应视图和关联控制器的中间窗格和左侧窗格。

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"));
        });
    }
}

控制器连接器
使用此类创建要传递到边框窗格集合方法的节点。

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();
        }
    }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题