【问题标题】:How create custom UI builder in Eclipse RCP如何在 Eclipse RCP 中创建自定义 UI 构建器
【发布时间】:2013-02-23 15:33:41
【问题描述】:

我有一个基于 Eclipse RCP 的应用程序,我希望它创建自定义 UI 构建器,最终用户可以在其中创建自己的仪表板(视图),其中将包含各种仪表、按钮、文本等。我希望一些实现了几个 UI 构建器(类似于WindowBuilder SWT),即包含带有 UI 元素的调色板、属性元素 UI 构建器等。结果将存储在一个 XML 文件中,该文件将加载 RCP 应用程序并在这个 XML 文件中应该创建视图。不幸的是,我不知道从哪里开始(有什么问题),创建自定义 UI 构建器的示例?

编辑:我已经完成了一个 UI 构建器,所以我是一个完整的初学者,但我想编写一个新的更好的。保存/加载xml文件不需要解决。困扰我(不知道怎么做)的是实际的 UI builder,即创建一个调色板 UI 元素,使用鼠标复制和移动元素,选择多个元素(移动)等。

感谢您的建议。

【问题讨论】:

    标签: java user-interface swt eclipse-rcp builder


    【解决方案1】:

    我有一个非常相似的要求,但我没有使用 RCP。我了解您希望将创建的 UI 的结构保存在一个 XML 中,然后在您想再次加载 UI 时加载该结构。所以我认为,如果您使用 XML,则必须为代表 UI 的 XML 标准文档使用模式或 XSD 模板。定义 UI 中允许的元素,示例:按钮、文本字段、标签等。您需要有一个定义明确的模板,因为无论何时编写 xml 或读取 xml,它都必须尽可能标准。

    如果你不习惯xsd,你可以先定义你的xml,然后使用xsd生成器,网上有很多。

    例如:

    <UIBuilder>
    <ownerProperties>
    <username>Marcelo Tataje</username>
    </ownerProperties>
    <ui>
    <header>
    <textlabel label="Welcome" />
    </header>
    <menu>
    <button label="Home" name="btnHome">goHome()</button>
    <button label="Contacts" name="btnContacts">showContacts()</button>
    </menu>
    <mainFrame>
    <textfield label="Name:" name="txtName" canEdit=false />
    <button label="Show name" name="btnProcess">processData()</button>
    </mainFrame>
    <footer></footer>
    </ui>
    <UIBuilder>
    

    并基于此,您可以创建一个架构:

    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="UIBuilder">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ownerProperties">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="username"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="ui">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="header">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="textlabel">
                          <xs:complexType>
                            <xs:simpleContent>
                              <xs:extension base="xs:string">
                                <xs:attribute type="xs:string" name="label"/>
                              </xs:extension>
                            </xs:simpleContent>
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="menu">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="button" maxOccurs="unbounded" minOccurs="0">
                          <xs:complexType>
                            <xs:simpleContent>
                              <xs:extension base="xs:string">
                                <xs:attribute type="xs:string" name="label" use="optional"/>
                                <xs:attribute type="xs:string" name="name" use="optional"/>
                              </xs:extension>
                            </xs:simpleContent>
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="mainFrame">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="textfield">
                          <xs:complexType>
                            <xs:simpleContent>
                              <xs:extension base="xs:string">
                                <xs:attribute type="xs:string" name="label"/>
                                <xs:attribute type="xs:string" name="name"/>
                                <xs:attribute type="xs:string" name="canEdit"/>
                              </xs:extension>
                            </xs:simpleContent>
                          </xs:complexType>
                        </xs:element>
                        <xs:element name="button">
                          <xs:complexType>
                            <xs:simpleContent>
                              <xs:extension base="xs:string">
                                <xs:attribute type="xs:string" name="label"/>
                                <xs:attribute type="xs:string" name="name"/>
                              </xs:extension>
                            </xs:simpleContent>
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                  <xs:element type="xs:string" name="footer"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    我用http://www.freeformatter.com/xsd-generator.html

    并使用 Jaxb 创建逻辑处理以创建基于已定义的格式良好的 XML 文档的 UI。

    【讨论】:

      【解决方案2】:

      一个人通过decomposing 开始一个大项目,将其分成越来越小的部分,直到您可以为一个部分编写代码。

      您可以从底部开始向上工作,也可以从顶部开始向下工作。

      这里有几个问题可以帮助你分解。

      您的项目将支持哪些组件(仪表、按钮、文本等)?

      一个用户有多少个不同的组件可用于一个面板?

      就编码而言,继续使用多面板编辑器设置一个 Eclipse RCP 项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 2015-06-12
        • 1970-01-01
        • 2021-02-28
        • 2013-11-20
        • 1970-01-01
        • 2020-01-29
        相关资源
        最近更新 更多