Структура Symfony имеет пакеты, которые могут анализировать HTML, и вы можете использовать стиль CSS для выбора DOMs вместо использования XPath .
Вывести свойство в ваш дочерний контроллер и наблюдать за ним из «родительского» контроллера. На ваш вопрос недостаточно информации, чтобы дать точный ответ, но он будет выглядеть примерно так:
public class ChildController {
@FXML
private TableView<Customer> customerTable ;
private final ReadOnlyObjectWrapper<Customer> currentCustomer = new ReadOnlyObjectWrapper<>();
public ReadOnlyObjectProperty<Customer> currentCustomerProperty() {
return currentCustomer.getReadOnlyProperty() ;
}
public Customer getCurrentCustomer() {
return currentCustomer.get();
}
public void initialize() {
// set up double click on table:
customerTable.setRowFactory(tv -> {
TableRow<Customer> row = new TableRow<>();
row.setOnMouseClicked(e -> {
if (row.getClickCount() == 2 && ! row.isEmpty()) {
currentCustomer.set(row.getItem());
}
}
});
}
}
, а затем вы просто выполните:
Stage stage = new Stage();
FXMLLoader fxmlLoader = new FXMLLoader(
getClass().getResource("../layout/SearchCustomer.fxml"));
Parent parent = (Parent) fxmlLoader.load();
ChildController childController = fxmlLoader.getController();
childController.currentCustomerProperty().addListener((obs, oldCustomer, newCustomer) -> {
// do whatever you need with newCustomer....
});
Scene scene = new Scene(parent);
stage.initModality(Modality.APPLICATION_MODAL);
stage.initOwner(parent.getScene().getWindow());
stage.setScene(scene);
stage.resizableProperty().setValue(false);
stage.showAndWait();
альтернативный подход заключается в использовании Consumer
в качестве обратного вызова в дочернем контроллере:
public class ChildController {
@FXML
private TableView<Customer> customerTable ;
private Consumer<Customer> customerSelectCallback ;
public void setCustomerSelectCallback(Consumer<Customer> callback) {
this.customerSelectCallback = callback ;
}
public void initialize() {
// set up double click on table:
customerTable.setRowFactory(tv -> {
TableRow<Customer> row = new TableRow<>();
row.setOnMouseClicked(e -> {
if (row.getClickCount() == 2 && ! row.isEmpty()) {
if (customerSelectCallback != null) {
customerSelectCallback.accept(row.getItem());
}
}
}
});
}
}
И в этой версии вы выполняете
Stage stage = new Stage();
FXMLLoader fxmlLoader = new FXMLLoader(
getClass().getResource("../layout/SearchCustomer.fxml"));
Parent parent = (Parent) fxmlLoader.load();
ChildController childController = fxmlLoader.getController();
childController.setCustomerSelectCallback(customer -> {
// do whatever you need with customer....
});
Scene scene = new Scene(parent);
stage.initModality(Modality.APPLICATION_MODAL);
stage.initOwner(parent.getScene().getWindow());
stage.setScene(scene);
stage.resizableProperty().setValue(false);
stage.showAndWait();