wicket

ListViewで生成したリンクとフォーム。フォームを見えないようにしてリンクをクリックしたらフォームがみょんと出現するようにしたかった。

Sample3.java

public class Sample3 extends WebPage {


	public Sample3() {
		final WebMarkupContainer container = new WebMarkupContainer("container");
		container.setOutputMarkupId(true);
		add(container);

		List<String> sample = Arrays.asList("sample","sample2","sample3");

		container.add(new ListView<String>("list",sample){

			/**
			 *
			 */
			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(ListItem item) {
				final MyForm form = new MyForm("form");
				form.setOutputMarkupId(true);
				item.add(form);

				final TextField<String> text = new TextField<String>("text");
				form.add(text);


				AjaxLink link = new AjaxLink("link") {

					@Override
					public void onClick(AjaxRequestTarget arg0) {
						form.setVisible();
						arg0.addComponent(container);
					}
				};
				item.add(link);
			}

		});

	}
}

class MyForm extends Form{

	boolean my = false;

	public MyForm(String id) {
		super(id);
		setVisible(my);
	}

	public void setVisible(){
		my = !my;
		setVisible(my);
	}


}

Sample3.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>

<div wicket:id="container">
	<div wicket:id="list">
	<a href="#" wicket:id="link">sample</a>
	<form wicket:id="form">
		<input type="text" wicket:id="text" />
		<input type="submit" />
	</form>
	</div>
</div>
</body>
</html>

上記だとリンクをクリックするときにもう一度ListView内のアイテムを生成して折角setVisibleをtrueにしてもまた生成するためfalseになってしまいフォームが展開しない。
ListViewでsetReuseItems(true)にすることで回避。これはなんだろ。生成したアイテムを利用して変更した部分だけ再生成しているという解釈でいいのかな??

Sample3.java

public class Sample3 extends WebPage {


	public Sample3() {
		final WebMarkupContainer container = new WebMarkupContainer("container");
		container.setOutputMarkupId(true);
		add(container);

		List<String> sample = Arrays.asList("sample","sample2","sample3");

		container.add(new ListView<String>("list",sample){

			/**
			 *
			 */
			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(ListItem item) {
				final MyForm form = new MyForm("form");
				form.setOutputMarkupId(true);
				item.add(form);

				final TextField<String> text = new TextField<String>("text");
				form.add(text);


				AjaxLink link = new AjaxLink("link") {

					@Override
					public void onClick(AjaxRequestTarget arg0) {
						form.setVisible();
						arg0.addComponent(container);
					}
				};
				item.add(link);
			}

		}.setReuseItems(true));

	}
}

class MyForm extends Form{

	boolean my = false;

	public MyForm(String id) {
		super(id);
		setVisible(my);
	}

	public void setVisible(){
		my = !my;
		setVisible(my);
	}


}