0

私は GWT を使用して Web アプリに取り組んでおり、UiBinders を使用してビルドするように変更中です。

それらを参照するクラスと同じパッケージに含まれるいくつかのバインダーの作業バージョンがありますが、これらの多くはアプリ全体で普遍的なユーティリティを備えており、それらを uibinders パッケージに分解したいと考えていました。

作業コードの一部を次に示します

TableListPanel.ui.xml ファイル:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:HTMLPanel>
<div id="tableListPanel">
    <g:HTMLPanel styleName="buttonPanel" ui:field="buttonPanel"></g:HTMLPanel>
    <g:HTMLPanel styleName="tableList" ui:field="tableList"></g:HTMLPanel>
    <table align="center"><tr>
        <td align="center"><g:HTMLPanel styleName="tableMenu" ui:field="tableMenu"></g:HTMLPanel></td>
    </tr></table>
</div>
</g:HTMLPanel>

</ui:UiBinder> 

TableListPanelBinder Java ファイル:

public class TableListPanelBinder extends Composite implements HasText {

private static AuditPanelUiBinder uiBinder = GWT
        .create(AuditPanelUiBinder.class);

interface AuditPanelUiBinder extends UiBinder<Widget, TableListPanelBinder> {
}

public TableListPanelBinder() {
    initWidget(uiBinder.createAndBindUi(this));
}

@UiField
protected HTMLPanel buttonPanel;

@UiField
protected HTMLPanel tableList;

@UiField
protected HTMLPanel tableMenu;

public void bindUiElement(HTMLPanel container, Widget widjetObj) {
    container.add(widjetObj);
}

最後に、ウィジェットを上記の ui:fields にバインドするコード内の呼び出し:

public AuditReportProfilesPanel() {
    super();
    this.setWidth("100%");
    this.setSpacing(4);


    this.parmSetsTable = createParmSetsTable();
    SimplePager.Resources pagerResources = GWT.create(SimplePager.Resources.class);
    pager = new SimplePager(TextLocation.CENTER, pagerResources, false, 0, true);
    pager.setDisplay(parmSetsTable);

    TableListPanelBinder reportListBinder = new TableListPanelBinder();
    this.add(reportListBinder);

    // -START- Bind UI Elements -START-
    reportListBinder.bindUiElement(reportListBinder.tableList, parmSetsTable);
    reportListBinder.bindUiElement(reportListBinder.tableMenu, pager);
    reportListBinder.bindUiElement(reportListBinder.buttonPanel, createActionBar());
    //-END- Bind UI Elements -END-
}

これはおそらくこれを設定するための最もクリーンな方法ではないことはわかっていますが、私は進んで学んでいます.

Binder を別のパッケージに移動すると、private/protected アクセス修飾子によってコードにアクセスできなくなることはわかっていますが、それらを public に変更しても何の役にも立ちません。

修正への提案は大歓迎です。このアプリにはいくつかの異なるクラス パッケージがあり (基本的にアプリ内の異なるページに相当します)、それらはすべて同様のテーブル設定を使用するため、すべてのパッケージでコードが重複することを避けたいと考えています。それを達成するための最善の方法について100%確信があるわけではありません。

Binders パッケージで Abstract クラスを作成し、個々のアプリ パッケージでそれらを拡張すると問題が解決しますか、それとも何か不足していますか?

4

1 に答える 1

1
  1. 指定された一般パッケージに、汎用UiBinderクラスと対応するクラス(Widgetsまたはsのいずれか)を記述します。それをパッケージViewと呼びましょう。my.general.uibinders
  2. UiBinder具体的なページ(または)に対応するあなたのではPlace、このパッケージをの先頭にあるタグのxmlns属性としてインポートします。こちらです:ui:UiBinderUiBinder

    <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
        xmlns:g="urn:import:com.google.gwt.user.client.ui"
        xmlns:c="urn:import:my.general.uibinders"> <!-- this is the addition -->
    
  3. これ以降、これはUiBindercに存在するクラスへの参照my.general.uibindersです。あなたがという名前のクラスを持っているとしましょう、MyGeneralViewそれをそのように使ってください:<c:MyGeneralView .../>あなたのを徹底的にUiBinder

于 2012-04-26T23:42:46.197 に答える