2016-03-11 3 views
0

У меня возникла проблема с дизайном. Если у меня есть (например) на левом стыковочном представлении представление списка, содержащее некоторые элементы pojo, как я могу уведомить центр, прикрепленный к нему, который выбран? Я пытаюсь реализовать какой-то Master-Detail-View, в котором пользователь выбирает один элемент, а затем может настраивать его в центральной области и в правой области. Заранее спасибоКак передавать информацию с одного вида (присоединенного) на другой?

+0

Это немного шире. См. http://stackoverflow.com/questions/14187963/passing-parameters-javafx-fxml/14190310#14190310 или http://stackoverflow.com/questions/32342864/applying-mvc-with-javafx для методов совместного использования данных между несколькими контроллеры/ –

+0

Проблема в том, что это довольно непросто с каркасом dromblerfx. – SirWindfield

ответ

0

Это зависит от того, как вы хотите проектировать свое приложение.

Если вы хотите создать отдельный редактор для каждого pojo, вы можете посмотреть на LeftTestPane, предоставленную drombler fx archetype для образца.

@FXML 
private void onNewSampleAction(ActionEvent event) { 
    sampleCounter++; 
    Sample sample = new Sample("Sample " + sampleCounter); 
    SampleEditorPane sampleEditorPane = new SampleEditorPane(sample); 
    Dockables.inject(sampleEditorPane); 
    Dockables.open(sampleEditorPane); 
} 

Там в настоящее время нет API для выбора уже открыт редактор, но, пожалуйста, обратите внимание, что редакторы в настоящее время совершенствуется с работы, проделанной за выпуск #111.

Если вы хотите получить один подробный вид, вы можете использовать Context Framework, который позволяет связываться с такими компонентами, как Dockables и Actions, в связном режиме.

ListView должен реализовать LocalContextProvider и сохранить выбранное pojo в своем локальном Context.

@ViewDocking(...) 
public class ListView extends SomeNode implements LocalContextProvider { 

    private final SimpleContextContent contextContent = new SimpleContextContent(); 
    private final SimpleContext context = new SimpleContext(contextContent); 
    private MyPojo currentSelection; 

    ... 

    @Override 
    public Context getLocalContext() { 
     return context; 
    } 

    ... 

    if (currentSelection != null){ 
     contextContent.remove(currentSelection); 
    } 
    currentSelection = <current selection> 
    if (currentSelection != null){ 
     contextContent.add(currentSelection); 
    } 
    ... 
} 

В этом случае DetailsView должен быть зарегистрирован как вид (Singleton), тоже, и реализовать LocalContextProvider, а также ActiveContextSensitive:

@ViewDocking(...) 
public class DetailsPane extends SomeNode implements ActiveContextSensitive, LocalContextProvider { 

    private final SimpleContextContent contextContent = new SimpleContextContent(); 
    private final SimpleContext context = new SimpleContext(contextContent); 
    private Context activeContext; 
    private MyPojo myPojo; 

    ... 

    @Override 
    public Context getLocalContext() { 
     return context; 
    } 

    @Override 
    public void setActiveContext(Context activeContext) { 
     this.activeContext = activeContext; 
     this.activeContext.addContextListener(MyPojo.class, (ContextEvent event) -> contextChanged()); 
     contextChanged(); 
    } 

    private void contextChanged() { 
     MyPojo newMyPojo = activeContext.find(MyPojo.class); 
     if ((myPojo == null && newMyPojo != null) || (myPojo null && !sample.equals(newMyPojo))) { 
      if (myPojo != null) { 
       unregister(); 
      } 
      myPojo = newMyPojo; 
      if (myPojo != null) { 
       register(); 
      } 
     } 
    } 

    private void unregister() { 
     contextContent.remove(myPojo); 

     //reset DetailsView 
    } 

    private void register() { 
     // configure DetailsView 

     contextContent.add(myPojo); 
    } 
... 
} 

Посмотрите на RightTestPane представленную drombler fx archetype для образца.

Смежные вопросы