6

GWT 2.0のUiBinderを介した宣言型アプローチを使用して、メニュー( MenuBar、 )を実装したいと思います。MenuItem

私は2つの問題に遭遇しました:

  1. .ui.xmlファイルにMenuItemSeparatorsを追加する方法はありますか?これまでのところ、私はMenuBarタグとMenuItemタグをファイルに入れることしかできませんでした。

  2. を使用して@UiHandler、GWTはイベントハンドラーのボイラープレートコードを記述します。メニューについては、コマンドを書く必要があります。UiBinderアプローチを使用してこれをどのように行う必要がありますか?ファイルに入れるコマンドタグはあり.ui.xmlますか?コマンドハンドラーの定型コードを自分で作成する必要がありますか?

これらの質問について考えてくれてありがとう!

4

6 に答える 6

7

私は同意します、あなたが入れようとすると、GWTがウィジェットを作成しようとすると、子になることができるのはaMenuItemSeparatorだけであると文句を言うでしょう。MenuItemこれは現在サポートされていないため、GWTチームの将来の拡張としてこれをリクエストすることをお勧めします。

それまでの間、プログラムでセパレータを追加し、次の方法でコマンドを追加できます。XMLファイル:

<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:HTMLPanel>
    <g:MenuBar ui:field="menuBar">
        <g:MenuItem ui:field="helpMenuItem">Help</g:MenuItem>
        <g:MenuItem ui:field="aboutMenuItem">About</g:MenuItem>
        <g:MenuItem ui:field="siteMapMenuItem">Site Map</g:MenuItem>
    </g:MenuBar>
</g:HTMLPanel>

Javaファイル:

public class Menu extends Composite {
...
@UiField MenuBar menuBar;
@UiField MenuItem helpMenuItem;
...
public Menu() {
    initWidget(uiBinder.createAndBindUi(this));
    // insert a separator
    menuBar.insertSeparator(1);
    // attach commands to a menu item
    helpMenuItem.setCommand(new MenuCommand(HistoryToken.Help));
    ...
}  

public class MenuCommand implements Command {
    final HistoryToken historyToken;

    public MenuCommand(HistoryToken historyToken) {
        this.historyToken = historyToken;
    }

    @Override
    public void execute() {
        historyToken.fire();
    }
}  

public enum HistoryToken {
    Help,About,SiteMap;

    public void fire(){
        History.newItem(this.toString());
    }
}


コードの他の場所で、HistoryListener変更をキャッチするためにを実装しました。

class HistoryManager implements ValueChangeHandler<String> {
    // 1. get token
    // 2. change it into a HistoryToken
    // 3. perform switch statement 
    // 4. change contents based upon HistoryToken found
...
}  
于 2010-02-15T19:29:15.203 に答える
2

(1)の場合、JavaDocは次のように述べています。

UiBinderテンプレートでの使用UiBinderテンプレートファイルのMenuBar要素は、垂直ブール属性(デフォルトはfalse)を持つことができ、子としてMenuItem要素のみを持つことができます。MenuItemには、HTMLとMenuBarが含まれる場合があります。

例えば:

 <g:MenuBar>
   <g:MenuItem>Higgledy
     <g:MenuBar vertical="true">
       <g:MenuItem>able</g:MenuItem>
       <g:MenuItem>baker</g:MenuItem>
       <g:MenuItem>charlie</g:MenuItem>
     </g:MenuBar>
   </g:MenuItem>
   <g:MenuItem>Piggledy
     <g:MenuBar vertical="true">
       <g:MenuItem>foo</g:MenuItem>
       <g:MenuItem>bar</g:MenuItem>
       <g:MenuItem>baz</g:MenuItem>
     </g:MenuBar>
   </g:MenuItem>
   <g:MenuItem><b>Pop!</b>
     <g:MenuBar vertical="true">
       <g:MenuItem>uno</g:MenuItem>
       <g:MenuItem>dos</g:MenuItem>
       <g:MenuItem>tres</g:MenuItem>
     </g:MenuBar>
   </g:MenuItem>
 </g:MenuBar>

「子としてのMenuItem要素のみ」という言葉からヒントを得て、私の推測では、MenuItemSeparatorはサポートされていません

于 2010-01-21T09:13:49.517 に答える
2

これに対する私の解決策の例を次に示します。これはGWT2.4.0でかなりうまく機能しているようです。

UiBinder:

<g:MenuBar vertical='true' ui:field='mainMenu'>
    <g:MenuItem ui:field='item1'>Item 1</g:MenuItem>
    <g:MenuItem ui:field='item2'>Item 2</g:MenuItem>
    <g:MenuItemSeparator />
    <g:MenuItem ui:field='sub' enabled='false'>
        Submenu
        <g:MenuBar vertical='true' ui:field='subMenu' />
    </g:MenuItem>
</g:MenuBar>

Java:

@UiField MenuItem item1;
@UiField MenuItem item2;
@UiField MenuBar subMenu;
@UiField MenuItem sub;

...

this.setWidget(uiBinder.createAndBindUi(this));
item1.setCommand(new Command() {
    public void execute() {
        History.newItem("item1");
    }
});

全体的に悪くはない。

于 2012-03-29T20:55:16.430 に答える
1

私はこの質問が古いことを知っていますが、私はグーグル検索でこの質問に出くわし続けているので、私はまだどこにも文書化されていないが、私は使用していることに注意することが重要だと思いました:

<g:MenuItemSeparator />

私のuibinderテンプレートで正常に。gwt eclipseプラグインは赤いエラーマーカーを表示しますが、MenuItemSeparatorがコンパイルされ、正常に表示されます。私はgwt2.1を使用しています。

誰かが知りたいと思うかもしれないと思っただけです。

残念ながら、私はまだ#2の解決策を見ていませんが、すぐに何かを提供してくれることを願っています。

于 2011-08-17T20:22:19.113 に答える
0

ファイルにmenuItemSeparatorを追加することができui.xmlます。これは、公式のGWT-APIページのセパレーターとサブメニューの例です。

于 2012-03-13T09:56:32.760 に答える
0

まあ、私はこれを実装する方法を見つけたと思います。(これは、*。ui.xmlファイル内でセパレーターを宣言する場合の解決策です。)

HocusView.java

...
    @UiField MenuBar  menuBar;
    @UiField MenuItem item1;
    @UiField MenuItem item2; 
    @UiField MenuItem item3; 
    @UiField MenuItem item4;   
...

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

    @UiTemplate("Hocus.ui.xml")
    interface HocusViewUiBinder extends UiBinder<Widget, HocusView>{}

    public HocusView() 
    {
        initWidget(uiBinder.createAndBindUi(this));   
         // Attach commands to menu items
        menuItem1.setScheduledCommand(cmd_menuItem1);
        menuItem2.setScheduledCommand(cmd_menuItem2);
        menuItem3.setScheduledCommand(cmd_menuItem3);
        menuItem4.setScheduledCommand(cmd_menuItem4); 

    }


    Command cmd_menuItem1= new Command(){ 
    @Override
    public void execute() { 
        Window.alert("  Gifts  ");
        }
    };
    Command cmd_menuItem2 = new Command(){ 
        @Override
        public void execute() { 
            Window.alert("  Gifts  ");
        }
    };
    Command cmd_menuItem3 = new Command(){ 
        @Override
        public void execute() { 
            Window.alert("  Gifts  ");
        }
    };  
    Command cmd_menuItem4 = new Command(){ 
        @Override
        public void execute() { 
            Window.alert("  Gifts  ");
        }
    };



    });

HocusView.ui.xml

  <gwt:MenuBar ui:field="menuBar" >  
    <gwt:MenuItem ui:field="menuItem1">Search</gwt:MenuItem> 
     <gwt:MenuItemSeparator></gwt:MenuItemSeparator>
    <gwt:MenuItem ui:field="menuItem2">Ingestion</gwt:MenuItem> 
     <gwt:MenuItemSeparator></gwt:MenuItemSeparator>
    <gwt:MenuItem ui:field="menuItem3">Analysis</gwt:MenuItem> 
     <gwt:MenuItemSeparator></gwt:MenuItemSeparator>
    <gwt:MenuItem ui:field="menuItem4">About</gwt:MenuItem> 
  </gwt:MenuBar>  

それと同じくらい簡単です。これにより、メニュー項目の間にセパレータが追加されます。

乾杯!

于 2014-02-21T14:09:03.940 に答える