当前,我有一个主控制器,该控制器控制将元素添加到边框窗格的左侧窗格中以进行导航,并控制中心窗格中的内容。我还使用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();
}
}
}