Навигация в простом веб-приложении Eclipse RAP
У меня такое чувство, что я собираюсь спросить здесь что-то неясное / базовое, но я новичок, когда дело доходит до технологий, и я не нашел "правильный" способ сделать что-то подобное, так что вот так.
Фон
Сейчас я занимаюсь разработкой веб-приложения как своего рода хобби-проекта. Я решил использовать Eclipse RAP ( RWT Standalone) для пользовательского интерфейса. Приложение будет развернуто на сервере Eclipse Virgo (вариант Tomcat), так как я планирую воспользоваться преимуществами инфраструктуры OSGI (упрощает реализацию некоторой бизнес-логики, но это выходит за рамки этого вопроса).
проблема
Приложение будет иметь несколько разделов, и только один из них должен быть виден одновременно. Хотя настройка RAP была относительно простой, мне трудно понять, как настроить навигацию между различными разделами приложения.
Под этим я подразумеваю, например, наличие таких кнопок, как "Данные" и "Настройки" в заголовке приложения, а содержимое под этими кнопками меняется в зависимости от того, какую кнопку нажимает пользователь.
Текущее решение
В настоящее время самое простое решение, которое я придумал, это
- Используйте активную оболочку в качестве родителя для видимого раздела
- Создайте вторичную невидимую оболочку в качестве родителя для всех неактивных разделов
- Если видимый раздел изменяется, используйте
currentlyVisibleSection.setParent(backgroundShell)
переместить видимый в данный момент раздел в фоновую оболочку иnewVisibleSection.setParent(activeShell)
сделать выбранный раздел видимым
Эта идея иллюстрируется следующим урезанным примером:
public class TestUI extends AbstractEntryPoint {
private Composite visibleSection;
private Shell backgroundShell;
public void createContents( Composite parent ) {
backgroundShell = new Shell();
//Implementation comes from other OSGI bundles
Composite dataSection = createDataSection(parent);
Composite settingsSection = createSettingsSection(backgroundShell);
visibleSection = dataSection;
Button dataButton = new Button(parent, SWT.PUSH);
dataButton.setText("Data");
dataButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (visibleSection!=dataSection) {
visibleSection.setParent(backgroundShell);
dataSection.setParent(parent);
visibleSection=dataSection;
parent.layout();
}
}
});
Button settingsButton = new Button(parent, SWT.PUSH);
settingsButton.setText("Data");
settingsButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (visibleSection!=settingsSection) {
visibleSection.setParent(backgroundShell);
settingsSection.setParent(parent);
visibleSection=settingsSection;
parent.layout();
}
}
});
}
}
Очевидно, что я убрал весь код компоновки и стилевого оформления, к тому же, ему все равно потребуется некоторая работа, чтобы выглядеть прилично для конечного пользователя. Требуется, чтобы я вручную отслеживал все различные разделы, создавая их и управляя ими, но это приемлемо для меня. Так что в целом это в значительной степени делает то, что мне нужно, но кажется немного "хакерским".
Вопросы
- Есть ли у этого способа некоторые существенные недостатки или фундаментальные недостатки?
- Есть ли лучший способ сделать что-то, просто используя Eclipse RAP?
Я также немного изучил использование рабочих пространств / перспектив Eclipse (Workbench), но, похоже, это значительно усложняет приложение (не говоря уже о начальной кривой обучения), и я предпочел бы избежать этого. Тем более, что мне не понадобится большая часть этой функциональности.
1 ответ
StackLayout
это рекомендуемый способ отображения стека управления, где только один будет виден одновременно.
В приведенном ниже примере создается область кнопок для отображения кнопок выбора ("Данные", "Настройки", ...) в верхней части родительского элемента, а контейнер занимает оставшееся пространство. Все разделы создаются внутри контейнера, который использует StackLayout
,
parent.setLayout( new GridLayout( 1, false ) );
Composite buttonArea = new Composite( parent, SWT.NONE );
buttonArea.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false ) );
Composite container = new Composite( parent, SWT.NONE );
container.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
StackLayout containerLayout = new StackLayout();
container.setLayout( containerLayout );
Composite dataSection = createDataSection( container );
Composite settingsSection = createDataSection( container );
Код слушателя выбора сообщает макету, какой раздел должен быть показан.
dataButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent event ) {
containerLayout.topControl = dataSection;
container.layout();
}
});
Подробнее о макетах см. Также в этой статье: https://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html
Ты на правильном пути. Не используйте рабочую среду ("рабочие пространства / перспективы", как вы ее назвали), она добавляет гораздо больше, чем вам, вероятно, понадобится. Кроме того, некоторые части этого стека могут использоваться независимо, когда это необходимо. Например, зрители JFace или основные команды.