Навигация в простом веб-приложении Eclipse RAP

У меня такое чувство, что я собираюсь спросить здесь что-то неясное / базовое, но я новичок, когда дело доходит до технологий, и я не нашел "правильный" способ сделать что-то подобное, так что вот так.

Фон

Сейчас я занимаюсь разработкой веб-приложения как своего рода хобби-проекта. Я решил использовать Eclipse RAP ( RWT Standalone) для пользовательского интерфейса. Приложение будет развернуто на сервере Eclipse Virgo (вариант Tomcat), так как я планирую воспользоваться преимуществами инфраструктуры OSGI (упрощает реализацию некоторой бизнес-логики, но это выходит за рамки этого вопроса).

проблема

Приложение будет иметь несколько разделов, и только один из них должен быть виден одновременно. Хотя настройка RAP была относительно простой, мне трудно понять, как настроить навигацию между различными разделами приложения.

Под этим я подразумеваю, например, наличие таких кнопок, как "Данные" и "Настройки" в заголовке приложения, а содержимое под этими кнопками меняется в зависимости от того, какую кнопку нажимает пользователь.

Текущее решение

В настоящее время самое простое решение, которое я придумал, это

  1. Используйте активную оболочку в качестве родителя для видимого раздела
  2. Создайте вторичную невидимую оболочку в качестве родителя для всех неактивных разделов
  3. Если видимый раздел изменяется, используйте 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 или основные команды.

Другие вопросы по тегам