2015-07-29 4 views
4

Учитывая приложение JavaFX с несколькими презентаторами и представлениями, организованными в иерархии. Как я могу транслировать события от родительского презентатора до дочернего презентатора/представления?Как транслировать событие в JavaFX

Моя архитектура выглядит следующим образом: У меня есть которым MainPresenter находится на вершине иерархии

public class MainPresenter { 

    @FXML private TreeView<String> navigation; 
    @FXML private AnchorPane  contentView; 
    @Autowired private MainView mainView; 
    @Autowired private DetailView detailView; 

    @FXML 
    public void initialize() { 

     // register a handler for selection of treeview items 
     navigation.getSelectionModel().selectedItemProperty().addListener(
      new ChangeListener<TreeItem<String>>() { 
       // ...   
       contentView.getChildren().clear(); 
       contentView.getChildren().add(detailView); 
       contentView.fireEvent(new ResourceEvent(ResourceEvent.SELECTED, model)); 
       // ... 
      } 
     ); 
    } 
} 

Существует также ведущий для зрения детализации выбранного элемента:

public class DetailPresenter { 

    @Autowired private DetailView  view; 

    @PostConstruct 
    public void postInit() { 
     // is being executed 
     view.getView().addEventHandler(ResourceEvent.SELECTED, (event) -> { 
      // not being invoked 
     }); 
    } 
} 

Что Я хочу добиться того, что всякий раз, когда элемент выбирается в TreeView, DetailView для этого элемента следует добавить в график сцены (работает), а DetailPresenter должен быть уведомлен о загрузке ресурса из бэкэнд-сервиса. Одним из решений для этого было бы просто автоподвести DetailPresenter в MainPresenter, чего я не хочу. Я хочу иметь свободную связь. Как я предположил из Документации on Event Handling, Событие отправляется вниз ко всем узлам графа сцены и затем возвращается к корню сцены. Поскольку EventHandler в моем DetailPresenter не вызывается, я полагаю, что событие не передается.

Мой вопрос будет, как бы достичь этого?

+0

Я уверен, что вы решили это право? или? – Elltz

+0

Фактически я закончил использование внешнего механизма публикации/подписки. Если вы используете Spring для своего приложения, посмотрите на события приложений springs. Я закончил свой собственный EventBus, так как мне не нужны какие-либо причудливые функции. – Markus

ответ

0

MyModel.java:

public class MyModel { 
    private StringProperty myString = new SimpleStringProperty(); 
    public void setMyString(String myString) { this.myString.set(myString); } 
    public String getMyString() { return myString.get(); } 
    public StringProperty getMyStringProperty() { return myString; } 
} 

Затем создайте экземпляр MyModel, как одноплодного боба (выглядит как вы используете Spring). И впрыснуть модель, где это необходимо:

@Bean 
public MyModel myModel() { 
    return new MyModel(); 
} 

Затем вводят его и привязать к свойству:

public class MyPresenter { 
    @FXML TextField myTextField; 
    @Autowired MyModel myModel; 

    public void initialize() { 
    myTextField.textProperty().bind(myModel.getMyStringProperty()); 
    } 
} 

Если теперь кто-то обновляет myString свойство интерфейс myTextField будет обновляться, а также.

Вы также можете зарегистрировать некоторый пользовательский обработчик по этим свойствам или использовать TwoWayBinding.

Таким образом, вам не нужно использовать его в качестве элемента пользовательского интерфейса, но он также может использовать его в качестве своего рода конвейера данных.