読者です 読者をやめる 読者になる 読者になる

AjaxTabbedPanel 内に配置した入力フィールド値をタブ切り替え時に受け取る

Wicket AjaxTabbedPanel を使った時に、タブの中に配置した入力フィールドの値をフォーム送信ボタンによる受信ではなく、
タブのクリック=タブ切り替えのタイミングで受け取る方法に悩んだ。

org.apache.wicket.extensions.markup.html.tabs.TabbedPanel の継承である AjaxTabbedPanel が、AjaxFallbackLink でタブのリンクを
作っているので、これを AjaxSubmitLink での実装にするものを自分で用意する。

当然、Form コンポーネントをタブを配置する親の方で配置する必要がある。

import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.extensions.ajax.markup.html.tabs.AjaxTabbedPanel;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
/**
 * AjaxTabbedPanelをAjaxSubmitLinkで実装
 */
public class YAjaxTabbedPanel<T extends ITab> extends AjaxTabbedPanel<T>{

	public YAjaxTabbedPanel(String id, List tabs){
		super(id, tabs);
	}
	public YAjaxTabbedPanel(String id, List tabs, IModel model){
		super(id, tabs, model);
	}
	@Override
	protected WebMarkupContainer newLink(final String linkId, final int index){
		return new AjaxSubmitLink(linkId){
			@Override
			protected void onSubmit(AjaxRequestTarget target, Form<?> form){
				onBeforeChangeTab(target, index);
				setSelectedTab(index);
				if (target != null){
					target.add(YAjaxTabbedPanel.this);
				}
				onAjaxUpdate(target);
			}
		};
	}
	protected void onBeforeChangeTab(final AjaxRequestTarget target, final int index){
	}
}

これで幸せになれるかもしれない。