2

私はウィケットを使用して、分離されたコンポーネントのセットを構築しています。イベント ドリブン メカニズムを使用してコンポーネントが通信できるようにしながら、クラス "GenericComponent" に Set を保持しています。基本的な考え方は、IGenericEvent から拡張されたペイロードとして "Someevent.class" を使用してイベントを送信することです。次に、GenericComponent クラスの onEvent メソッドで、Set に追加されたすべてのイベントを調べます。クラスがペイロードと一致する場合、イベントを実行する必要があります。

今いくつかのコード:

汎用コンポーネント

public class  GenericComponent<T> extends GenericPanel<T>
{
//...
    protected Set<IGenericEvent>eventSet = new HashSet<IGenericEvent>(); 
//...

    public void addEvent(final IGenericEvent event)
    {
        boolean result = eventSet.add(event);
        if (!result)
        {

            throw new IllegalArgumentException("Event already added ...");
        }
    }

    @Override
    public void onEvent(final IEvent<?> event)
    {
        for (IGenericEvent e : eventSet)
        {

            if (e.getClass().equals(event.getPayload()))
            {

                e.action(this.getContainer());
            }

        }
        update();
    }

}

IGenericEvent

public interface  IGenericEvent
{

    public void action(final WebMarkupContainer container);

}

HideEvent

public class Hide implements IGenericEvent, Serializable
{
    private static final long serialVersionUID = 1L;

    @Override
    public void action(WebMarkupContainer container)
    {
        container.setVisible(false);

    }

}

問題:

前述のように IGenericEvent を実装する onAction イベントを定義すると、すべて問題ありません。

問題は、インターフェイスの匿名実装として、ページ自体でそれを行う場合です。その場合、クラスは PageSomething$1,2,3 になります。

errorMessage.add(new Hide()
{
    private static final long serialVersionUID = 1L;

    @Override
    public void onAction(Component component)
    {
        System.out.println("here");
    }


});

私はすでに isAsignableFrom と Class.isIntance を試しましたが、確かに理にかなっています。匿名実装のクラスは PageSomething です。したがって、isAsignableFrom または isInstance は適用されません。

ジェネリックを使用して実際のクラス/インターフェイスを使用する必要があるとは信じていません。何かのようなもの

AbstractEvent<Hide>.

皆さんが問題を理解してくれることを願っています。

前もって感謝します。

4

0 に答える 0