在简单的 Eclipse RAP 中导航 web-application

Navigation in a simple Eclipse RAP web-application

感觉这里obvous/basic要问点什么,但是技术方面我是菜鸟,还没有搞清楚"correct"的做事方式就这样吧。

背景

我目前正在开发一个 web-application 作为业余爱好项目。我决定使用 Eclipse RAP(RWT Standalone) for the UI. The application will be deployed on Eclipse Virgo 服务器(Tomcat 变体),因为我打算利用 OSGI 框架 (使一些业务逻辑更容易实现,但这超出了这个问题的范围).

问题

该应用程序将有多个部分,一次只能显示其中一个部分。虽然设置 RAP 相对容易,但我无法理解如何在应用程序的不同部分之间设置导航。

我的意思是,例如在应用程序 header 中具有 "Data" 和 "Settings" 等按钮,并且这些按钮下方的内容会根据用户单击的按钮而变化.

当前解

目前我想到的最简单的解决方案是

  1. 使用活动 Shell 作为可见部分的 parent
  2. 为所有非活动部分
  3. 创建一个次要的不可见 Shell 作为 parent
  4. 如果可见部分发生变化,则使用 currentlyVisibleSection.setParent(backgroundShell) 将当前可见部分移至背景 Shell 并使用 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();
                }
            }
        });
    }
}

显然我已经去掉了所有的布局和样式代码,而且它仍然需要一些工作才能让最终用户看起来体面。它确实需要我手动跟踪所有不同的部分,创建它们并管理它们,但这对我来说是可以接受的。所以总的来说,这几乎完成了我需要它做的事情,但感觉有点 "hackish".

问题

我也研究了一下使用 Eclipse workspaces/perspectives (Workbench),但这似乎给应用程序增加了大量的复杂性(更不用说最初的 learning-curve ),我宁愿避免它。特别是因为我不需要大部分功能。

StackLayout 是显示控件堆栈的推荐方式,一次只能显示一个控件。

下面的示例创建按钮区域以在父级顶部显示选择按钮("Data"、"Settings"、...),容器占用剩余的 space .所有部分都在使用 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

你走在正确的轨道上。不要使用 workbench(如您所说的 "workspaces/perspectives"),它添加的内容比您可能需要的要多得多。此外,该堆栈的某些部分可以在需要时独立使用。例如 JFace 查看器或核心命令。