Как передать информацию из одного представления (закрепляемого) в другое?
Я столкнулся с проблемой дизайна. Если у меня (например) слева в представлении закрепляемой панели есть представление списка, содержащее некоторые pojo, как я могу уведомить центральную закрепляемую панель, какая из них выбрана? Я пытаюсь реализовать какой-то режим Master-Detail-View, в котором пользователь выбирает один элемент, а затем может настроить его в центральной области и правой области. Заранее спасибо:)
1 ответ
Это зависит от того, как вы хотите разработать свое приложение.
Если вы хотите создать отдельный редактор для каждого pojo, то вы можете взглянуть на LeftTestPane, предоставленный архетипом drombler fx для примера.
@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, который позволяет таким компонентам, как Dock ables и Actions, обмениваться данными в слабосвязанной форме.
ListView должен реализовывать LocalContextProvider и сохранять выбранное pojo в своем локальном контексте.
@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 для примера.