私はウィケットを使用して、分離されたコンポーネントのセットを構築しています。イベント ドリブン メカニズムを使用してコンポーネントが通信できるようにしながら、クラス "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>.
皆さんが問題を理解してくれることを願っています。
前もって感謝します。