2015-06-21 2 views
0

У меня есть простое требование: Мое приложение содержит 2 MPART. Один MPart содержит список идентификаторов, отображаемых в TreeView из базы данных. Нажимая на любой идентификатор, другой MPart должен заполнять/отображать данные, относящиеся к выбранному идентификатору (из БД) в TableView.Как загрузить данные в TableView одного MPart, выбрав один из дочерних элементов TreeViewer из другого Mpart

Я написал, первый MPart и отображает идентификаторы в TreeView. При клике захватывается выбранный пользователем идентификатор и извлекаются данные, относящиеся к этому идентификатору из БД. Используя EPartService, я получил ссылку на 2-й MPart. Но не удалось изменить его TableView. (сначала я заполнил этот TableView пустыми строками по умолчанию). В основном я пытаюсь изменить 2-й Mpart с 1-го Mpart.

Я новичок, пробовал все связанные должности, доступные в сети. Пожалуйста, укажите мне правильное направление

+0

пожалуйста, вы можете показать нам свой код? – hoijui

ответ

0

Если у вас есть MPart для представления таблицы можно вызвать getObject(), чтобы получить свой класс вида:

MPart tableViewPart = .... 

MyTableView view = (MyTableView)tableViewPart.getObject(); 

// TODO call some method of MyTableView to set the table 

где MyTableView класс вы определили для просмотра части в Заявке. e4xmi.

Примечание: Если деталь еще не указана, объект будет иметь значение NULL. Используйте EPartService.showPart, чтобы показать деталь и создать объект.

+0

Спасибо, Грег, я попробовал это раньше, но не работал. Пожалуйста, найдите мой код, кажется, я делаю какую-то глупую ошибку. – andreas

+0

Спасибо, Грег, я попробовал это раньше, но не работал. Пожалуйста, найдите мой код, кажется, я делаю какую-то глупую ошибку. \t \t MPart vp = partService.findPart ("vp"); // Получение refenrece здесь \t InfoPart ip = (InfoPart) vp.getObject(); // vp.getObject(); return null \t TableViewer tv = ip.getViewer(); \t tv.setInput (mi); – andreas

+0

Если деталь еще не была показана, объект еще не был создан - используйте «EPartService.showPart», чтобы показать деталь и создать объект. –

0

В следующем ответе я буду упомянуть, что вы говорите о JFace TreeViewer и TableViewer. Если вы говорите о JavaFX TreeView и TableView, вам нужно будет использовать другой способ захвата события выбора, но использование ESelectionService останется прежним.

Установка Выбор

В части с деревом вы можете использовать инъекции зависимостей, чтобы получить ESelectionService

@Inject private ESelectionService selectionService; 

Вы можете добавить ISelectionChangedListener к TreeViewer и направить выбор на выбор сервис.

ISelectionChangedListener selectionListener = new ISelectionChangedListener() { 
    @Override 
    public void selectionChanged(SelectionChangedEvent event) { 
     IStructuredSelection selection = (IStructuredSelection) event.getSelection(); 
     selectionService.setSelection(selection); 
    } 
}; 
treeView.addSelectionChangedListener(selectionListener); 

Вместо того, толкая IStructuredSelection к контексту можно также использовать идентификатор непосредственно, то есть с помощью selection.getFirstElement().

Наблюдение Выбор

В части с таблицей показывая детали вы можете иметь текущий выбор впрыскивается. Этот метод будет называться каждый раз, когда изменяется выбор.

@Inject 
public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional Object selection) { 
    // process the selection 
} 

Обратите внимание на использование @Optional здесь. Это гарантирует, что метод также вызывается, когда активным выбором является null.

Дополнительная информация

Для получения дополнительной информации о ESelectionService пожалуйста, обратитесь к этой обучающей программе: http://eclipsesource.com/blogs/tutorials/eclipse-4-e4-tutorial-part-7-services/

+0

Спасибо Кристоф, решение отлично подходит для моего требования. Я могу обновить TableView на основе выбора идентификатора в TreeView. Но не удалось увидеть обновленный TableView с данными в MPart, кажется, что MPart/TableView не освежает. Любые указатели на него? – andreas

+0

Я не понимаю, что вы имеете в виду. Вы можете «обновить TableView», но «MPart/TableView не освежает»? Измените вопрос и покажите нам свой код. –