2

私はインターフェース設計にまったく慣れておらず、イベントを処理する最良の方法が何であるかを理解するのに苦労しています。ハンドラーと (この場合) イベントを発生させるボタンが同じクラスにある単純なケースでは、それで問題ありません。ハンドラーはボタンを見ることができるので、次のように言うことができます:

if (event.getSource() == myButton)

また、ハンドラーは同じクラスにあるため、そのクラスなどにローカルなオブジェクトにタブを追加できます。

問題: ハンドラーとイベント ジェネレーターが異なるクラスにある場合、どのように対処すればよいかわかりません。

例えば

メイン レイアウト クラスから、カスタム ダイアログを作成して表示します。そのダイアログは、独自のクラスに実装されています。理想的には、ダイアログはメイン レイアウト クラス (ClickHandler を実装する) のハンドラーを使用しますが、これで問題ありませんが、私のアプリケーションにはいくつかの異なる ClickEvents があります。ソースを確認して上記のように区別します。ただし、この場合、ボタンはダイアログ クラスにあるため、次のように単純に言うことはできません。

if (event.getSource() == myDialogbutton)

myDialogBu​​tton はスコープ内にないためです。

これがどのように機能するかについてのヒントをいただければ幸いです。

D

4

5 に答える 5

4

おそらく私は私の解決策であなたを助けることができます...

ClickHandler をジェネリックな独自のクラスに継承しました。ClickHandler には任意の種類のオブジェクトを指定でき、内部のメソッドからアクセスできます。

例:

import com.google.gwt.event.dom.client.ClickHandler;

public abstract class ClickHandlerData<T> implements ClickHandler {
    private T data;

    public ClickHandlerData(T data)
    {
        this.data = data;
    }

    public T getData()
    {
        return data;
    }

    public void setData(T data)
    {
        this.data = data;
    }
}

さて、ボタンの場合:

Button btn = new Button("click me");
btn.addClickHandler(new ClickHandlerData<Button>(btn)) {
    public void onClick(ClickEvent event) {
        Button btn = getData();
        ...
    }
}

このクラスを使用して、整数などのパラメーターを ClickHandler に渡します。例えば:

for (int i=0;i<10;i++)
{
    Button btn = new Button("click me");
    btn.addClickHandler(new ClickHandlerData<Integer>(i)) {
        public void onClick(ClickEvent event) {
            Window.alert("you klicked button "+getData());
            ...
        }
    }
}

また、AsyncCallbacks、コマンド、およびデータを渡す必要がある他のすべてのものについても同じことを行います。

これが少しお役に立てば幸いです。

于 2011-07-29T17:37:13.620 に答える
1

FlexTable のボタンなど、匿名またはシリアル ウィジェットごとに新しいリスナーを作成してみてください。このようにして、それらのライフ サイクルが接続され、相互に参照するだけになります。

  1. ウィジェットを拡張する
  2. ID を指定してコンストラクターに追加します [ID が他に類を見ないものであることを確認してください]
  3. リスナー クラスを実装します。
  4. 同じ種類のアイテムを作成するたびに、リスナーの新しいインスタンスを作成します。
  5. ウィジェットに接続された特定のオブジェクトがあると思います。その場合、HashMap を保持します。

力があなたと共にありますように

于 2013-07-13T02:58:39.710 に答える
1

複数のボタンに 1 つのリスナーを使用しようとしているように見えますが、複数のボタンが同じ機能を持っていない限り、異なるリスナーを使用する必要があります。

一般に、「イベント ジェネレータ」ごとに 1 つのリスナーではなく、関数ごとに 1 つのリスナーを使用するようにしてください。

たとえば、ログアウト ボタンがある場合、LoginStatusWidget からのリスナー (クライアントが誰としてログインしているかを表示する) と、ログアウトのサーバーに通知する責任を負うオブジェクトからのリスナーがある場合があります。

コンポーネントを互いに分離するのに役立ちます。

于 2013-01-14T14:51:34.467 に答える
1

まず、ボタンとその ClickHandler を同じクラスに集めることをお勧めしますが、それが不可能な場合は、次のような提案があります。

ボタンを作成するときに、いくつかの情報を追加できます。

Button button = new Button("submit");
button.setLayoutData(someObj);

そして、イベントを発生させた後、ClickHandler のイベントからボタンを取得し、それがどのボタンであるかを調べることができます。

Button button = (Button) event.getSource();
MetaData someObj = (MetaData) button.getLayoutData(); 
于 2013-01-14T17:17:08.223 に答える
0

あなたはただできませんか:

final Button source= new Button("My Button");

button.addClickHandler(new ClickHandler() {
   @Override
   public void onClick(ClickEvent event) {
         doSomething(source);
   }
}

ボタン インスタンスは final とマークする必要があることに注意してください。

于 2013-08-09T21:22:08.520 に答える