Wicket ListView erstellen

cl0udt

Lt. Junior Grade
Registriert
Sep. 2008
Beiträge
508
[JAVA] Wicket ListView erstellen

Hallo zusammen,

habe ein ziemlich nerviges Problem und ist jetzt auch schon sehr viel zeit drauf gegangen, ohne dass ich Ergebnisse erzielen konnte.
Ich habe ein auf einer meiner Pages ein Textfeld, mit dem man User in meiner Datenbank suchen kann. Beim klick auf suchen, bekomme ich auch eine List<User> zurück (bzw. List<IModel<User>>. Dies alles geschieht in einer Form:

Code:
Form form = new Form("searchForm"){
                        userList = new ArrayList<IModel<User>>();
                        userList = userdao.searchByUsername(searchUser.getValue());

			protected void onSubmit() {
                        if (userList.size() > 0){
                        // Hier soll eine Liste mit den Usern angezeigt werden,
                        // bei der der Username verlinkt ist, z.b. via setResponsepage(...)
                        }
                        else ...
                        };
}
add (form);

Wie in dem Kommentar geschrieben, möchte ich einfach nur eine Liste der User angezeigt bekommen, bei der ich z.b. auf den Username klicken kann.
Ich bekomme es aber einfach nicht hin. Im Prinzip ist mir egal, wie ich es mache, aber es soll möglichst einfach gehalten sein. Ohne dass ich noch groß hilfsklassen anlegen muss. Am liebsten wäre mir ja eines der beispiele auf der Wicket-Page, wie z.B. DataView gewesen, aber das erscheint mir doch sehr viel Aufwand.

Hat jemand eine Idee, wie ich das möglichst simpel hinbekomme? Danke schonmal!!
 
Zuletzt bearbeitet:
Ich kann nicht einschätzen, wie viel du schon weißt. Ich gebe dir mal ein ganz primitives Beispiel. Vielleicht reicht dir das ja schon zum Nachbauen.
Code:
public class HomePage extends WebPage {
	private static final long serialVersionUID = 1L;

	private UserPanel userPanel;

	@SuppressWarnings("serial")
	public HomePage(final PageParameters parameters) {
		super(parameters);

		final List<User> userList = new ArrayList<User>();
		userList.add(new User("whatever"));
		userList.add(new User("foo"));
		userList.add(new User("bar"));

		final AjaxFallbackLink<Void> ajaxFallbackLink = new AjaxFallbackLink<Void>("link") {

			@Override
			public void onClick(AjaxRequestTarget target) {
				userPanel.setVisible(true);
				target.add(userPanel);
			}
		};
		ajaxFallbackLink.add(new Label("label", "Click me"));
		add(ajaxFallbackLink);

		LoadableDetachableModel<List<User>> userListModel = new LoadableDetachableModel<List<User>>(userList) {

			@Override
			protected List<User> load() {
				return getObject();
			}

		};
		userPanel = new UserPanel("userList", userListModel);
		userPanel.setOutputMarkupPlaceholderTag(true);
		userPanel.setVisible(false);
		add(userPanel);
	}
}

Code:
@SuppressWarnings("serial")
public class UserPanel extends Panel {

	private final IModel<List<User>> users;

	public UserPanel(String id, IModel<List<User>> model) {
		super(id, model);
		users = model;
	}

	@Override
	protected void onInitialize() {
		super.onInitialize();

		add(new ListView<User>("list", users.getObject()) {

			@Override
			protected void populateItem(ListItem<User> item) {
				item.add(new Label("user", item.getModelObject().name));
			}
		});
	}
}

Code:
public class User {

	public String name;

	public User(String name) {
		this.name = name;
	}
}

Homepage.html
Code:
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<body>
  <a wicket:id="link"><span wicket:id="label" /></a>
  <div wicket:id="userList" />
</body>
</html>

UserPanel.html
Code:
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
  <div wicket:id="list">
    <span wicket:id="user" />
  </div>
</wicket:panel>
</body>
</html>
 
Hallo Tumbleweed,

erstmal herzlichen Dank für deine Hilfe!
Ich habe das jetzt testweise mal implementiert und so ungefähr Stelle ich mir das auch vor.
Im Prinzip habe ich das alles so übernommen, bis auf die User-Class - die habe ich ja selbst schon.

In meinem Beispiel mit der Form, erstelle ich selbst schon eine userList beim klicken auf den "search"-Button:

Code:
	public ModifyUser() {
		super();
	
		FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
		add(feedbackPanel);
		final TextField<String> searchUser = new RequiredTextField<String>("searchUser", new Model<String>()); 


		Form form = new Form("searchForm"){

			protected void onSubmit() {
			
				userList = new ArrayList<User>();
				userList = userdao.searchByUsername(searchUser.getValue());
				User user = userdao.getNew();
				
				if (userList.size() > 0){
					for (int i = 0; i < userList.size(); i++){
					user = userList.get(i);
					}	
				}
				else info("Kein User gefunden");
				
			}
		};

               // hier kommt nun dein vorgeschlagener Code von Homepage.java, 
               // also mit dem AjaxLink
}

html-mäßig sieht ModifyUser so aus:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>modifyUser</title>
</head>
<body>

<wicket:extend> 

<span >Suchbegriff eingeben:</span><br/>
<form wicket:id="searchForm">
<input type="text" wicket:id="searchUser" />

<input type="submit" value="Bestätigen" /> 




</form>
<span wicket:id="feedback">feedbackmessages will be put here</span>


  <a wicket:id="link"><span wicket:id="label" /></a>
  <div wicket:id="userList" />

</wicket:extend>

</body>
</html>

Ich würde halt gerne im AjaxLink auf die erstellte Liste aus der Such-Form zugreifen,
aber das bekomm ich irgendwie nicht hin. Das scheitn auf diese Art und Weise leider nicht zu funktioneren.

Im Prinzip soll es so aussehen:
Eine Seite, auf der nur ein Textfeld mit "Such"-Button ist. Ich suche nach einem User und es erscheinen die gefunden User. Dieses sollen halt selbst auch nochmal Links sein. Klickt man dann auf einen der User, dann soll man auf eine neue Seite weitergeleitet werden (dort will ich sie dann bearbeiten können, aber das ist eine andere Geschichte).

P.S.: Da du ja erfahrener bist als ich und jetzt genauer weißt, worauf ich hinaus will: Würdest du das anders gestalten bzw. angehen?

Vielen Dank schonmal.
 
Zuletzt bearbeitet:
Ich werde mich morgen Abend mal daran versuchen, wenn ich von der Arbeit zurück bin. Falls jemand schneller ist, habe ich natürlich auch nichts dagegen. ;)

Erfahrener hm... ein paar Monate arbeite ich mit Wicket, allerdings ist es schon was anderes mit "reinem" Wicket zu arbeiten und nicht schon sämtliche Strukturen verfügbar zu haben, wie auf der Arbeit, wo einfach schon eine riesige Plattform steht. :D

Da ich gerne die Ajax-Funktionalitäten von Wicket nutze, würde ich vermutlich kein Form benutzen, sondern das Eingabefeld mit einem onchange listener versehen und dann dynamisch die Liste bereits während der Eingabe anzeigen. Das sieht immer ganz hübsch aus. Beim Form submit müsste ich mir erst mal ansehen, wie man da in Standard-Wicket die Form-Daten in die response page bekommt. Vermute mal, ganz klassisch über das request-Objekt oder als PageParameter. Vielleicht bist du da ja auch schon schlauer als ich.
 
Zuletzt bearbeitet:
Also ich wäre dir über jede weitere Hilfe sehr dankbar :)

mit Responpage wäre das kein Problem. Würde mir das relativ einfach machen und dem Konstruktor der neuen Seite einfach den jeweiligen User übergeben den ich angeklickt habe, das ist nicht das Problem.

Viel eher ist halt die Anzeige der User ein Problem, die beim Klicken auf den Suchbutton erscheinen soll...ich versuch das jetzt auch mal mit dem onchange listener, vielleicht krieg ich das ja irgendwie hin :).
 
Zurück
Oben