简体   繁体   中英

Displaying number of search results in Wicket form

In my current Apache Wicket project I have a search form for querying the database and displaying the query results in a ListView . The search input box is on the same page as the ListView with the results, and that ListView is filled with query results from a DAO, during invocation of the onSubmit() method of the form.

Everything works fine, but I need to display the number of search results. I tried to create a Label that is filled with the value of the size() method of the list got by the getList() method of the ListView instance, but no luck.

Thank you for any help in advance.

Depending on how you have built this form, you might only need to do label.setModelObject(listResults.size()) . It's difficult to tell without seeing how are you doing it.

By what you're telling in your question, probably you're creating your Label like this new Label(labelId, listView.getList().size() . This won't work, you're setting the Label's Model at construction time with a constant value, that's the size of the list at construction time. You need to get that value inside a Model 's getObject() to make the value "dynamic". Like, for instance,

AbstractReadOnlyModel sizeModel = new AbstractReadOnlyModel(){
    public getObject(){
        return listView.getList().getSize();
    }
}
new Label(labelId, sizeModel);

With this, every time the page renders, sizeModel().getObejct() will be called to retrieve the value for the Label . In that other way, the Label has got a Model with a constant value.

You could even do label.setModelObject(list.size()) in the onSubmit() method.

From my ignorance on how you have built this form, I'll show you how would I do this. The List of results would be retrieved with a LoadableDetachableModel . That would be the Model of the ListView . Then, the Label can have for instance an AbstractReadOnlyModel that uses the ListView s modelObject to get its size.

public class MyForm extends Form {


    private LoadableDetachableModel resultsModel;
    private IModel searchModel;
    public MyForm(){
        searchModel = new Model();
        TextField searchTextField = new TextField("search", searchModel);
        resultsModel = new LoadableDetachableModel(){
             protected Object load(){
                 return myService.get(searchModel.getModelObject());
             }
        }
        ListView lv = new ListView("list", resultsModel){
            // ...
        }
        Label resultsCount = new Label("count", new AbstractReadOnlyModel(){
              public Object getObject(){
                   return ((List) resultsModel.getObject()).size();
              }
        })
        SubmitButton button = new SubmitButton(){
             public void onSubmit(){
                 //... No actions needed, really
             }
        }
        // add's...
    }
}

Using a LoadableDetachableModel for the ListView has the advantage of automatically detaching the Model , and therefore avoiding the whole List of results to get serialized into the Session .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM