Hi I created webapp and I have DropDownChoice (default value "A") but when I selected some item ("B") from DropDownChoice and then I do some Action (for example sumbmit) and after I press back button at browser so my DropDownChoice is selected to "B" but I want "A" because it is default value
HOW can I handle back press and set DropDownChoice on default value ???
Wicket keep page state even after you leave the page. If you visit the same page more than once, the state of your page is stored by Apache Wicket, and will be displayed to the user exactly before they leave the page.
You need to clear your model.
public class AnyPage extends WebPage{
public AnyPage(PageParameters pageParameters){
super(pageParameters);
}
#Override
public void onConfigure(){
// Clear the List of choices here
this.listDropdown.clear();
// set dropdown model to null
this.setDropdown(null);
}
}
#Override
public void onConfigure();
is executed everytime your page is loaded.
I guess that you are passing to the DropDownChoice a model that depends on the value that was submitted
Related
How can I validate that not more than one checkbox is selected in a listview (repeater)?
I have a Form with a ListView in Wicket with following structure:
line 1 to n: AjaxCheckBox and TextField
Both elements are connected by CompoundPropertyModel<SimpleType>. POJO SimpleType looks like:
public class SimpleType {
private boolean enabled;
private String value;
Getter/Setter...
}
If more than one checkbox is selected, form should reject any changes. So the user must deselect the selected checkbox first before he can choose another checkbox.
I tried with surrounded CheckGroup with IValidator<Collection<SimpleType>>, but I need to change AjaxCheckBox to component Check. In this case Check seems to be not updated with state enabled from CompoundPropertyModel.
Do I really need a Validator or Visitor for this case? How to implement them?
Since radio is not an option here is a simple solution that should work:
For validation use IFormValidator that visits all AjaxCheckBox-es.
For immediate UI response I'd use plain JS that unchecks the previous checked checkbox. This would fire Wicket Ajax call to unselect it at the server side too.
Once the complete form is submitted the IFormValidator would do its work.
I'm currently trying to implement an "import wizard" for an application using JFace Wizard.
Basically I have to add the next page "just in time" based upon the input from the user, as each "step" within the wizard is depends upon the previous ones.
So, in the constructor of WizardImport I would add the first page, using:
addPage(new WizardImportSourcePage(data));
Within this page (WizardImportSourcePage) I would then like to add the next page, depending upon the chosen source, e.g.:
btnCsv.addSelectionListener(new SelectionAdapter() {
#Override
public void widgetSelected(SelectionEvent arg0) {
data.getWizard().addPage(new WizardImportSourcePage(data));
setPageComplete(true);
}
});
As you can see all of this happens in the appropriate Listener. Unfortunately this doesn't work. The Wizard is missing the "Next" button, but only shows the "Finish" button, as it doesn't know anything about the next page until the button is actually being pressed. I've already tried to invoke updateButtons(), but it didn't change anything.
So, any suggestions how to make it work? What would be the right way to build the wizard pages dynamically? Most tutorials seem to assume that the pages are created in the beginning and only the ordering is changed using getNextPage().
In your code extending Wizard you can override
public IWizardPage getNextPage(IWizardPage page)
which lets you decide which page to return next given the current wizard page (there is also a getPreviousPage.
I have a wizard comprising of three pages page1 , page2, page3.
I'm in page 2 and I press "Next" button , where some validations for duplicate creation needs to verified based on inputs form page1 and a selection inputs entered in page2.
Which method should i override inorder to include my validations and pop up a message box(complaining about duplicacy) on click of Next button of page2.
You can override WizardPage.getNextPage() and return null to prevent the next button from operating.
It is more usual to validate the user input as it happens and call WizardPage.setPageComplete(false) to disable the next button completely until the page is valid.
Call WizardPage.setErrorMessage(msg) or WizardPage.setMessage(msg, type) to display messages.
So, I got a wicket page with some components I can update, and some of them updates automatically.
this.getFieldOneInput().add(new AjaxFormComponentUpdatingBehavior("onchange") {
#Override
protected void onUpdate(AjaxRequestTarget target) {
Panel.this.populateFieldTwo(target);
Panel.this.populateFieldThree(target);
}
});
There is an auto complete feature so I can fill my field on with available objects from DB. And every time i change my field one value, I will also populate fields two and three.
But I need to do something else here. I need to check if the chose object for field on got some null valued attribute. If any of its attribute is null, I want to show an error message on screen: "FieldOne attribute X is null". I want it to be shown on screen like those red wicket messages when some field is required.
How can I do that?
By using the Wicket FeedbackPanel
HTML:
<div wicket:id="feedback"></div>
Page:
Add a new FeedbackPanel, and just do error(message)
Reference: http://www.wicket-library.com/wicket-examples/compref/wicket/bookmarkable/org.apache.wicket.examples.compref.FormPage?0
Here is the situation. I have a drop down menu. The option sin this drop down menu are being populated by fetching some values from the database. To do this following is what i have done.. :-
<select name="product_list" onchange="selectProduct(this.value)">
<option value="none">Select one</option>
<%
List<String> options = new ArrayList<String>();
DynamicCombo comboBox = new DynamicCombo();
options = comboBox.generateComboBox();
Collections.sort(options);
int tempVar = 0;
while (tempVar < options.size()) {
out.print("<option value=\"");
out.print(options.get(tempVar));
out.print("\">");
out.print(options.get(tempVar));
out.print("</option>");
tempVar++;
}
%>
</select>
DynamicCombo is a class that has a method called 'generateComboBox()'. This method simply returns an array list containing all the values that are fetched from the database, which is what i need to show in my drop down box in the front end (jsp page). On my jsp page i simply iterate through this list and print it as options appropriately.
This works absolutely fine.
Now i have another text box on my form, say 'textbox1'. Now the requirement is that this text box value should be updated depending on what the user has selected from the above drop down box.
So for example if the user selects 'prod1'(which is a primary key in the backend database table) option from the drop down box, then the corresponding value ( the product name) should be fetched from the database table and should be updated in the textbox named 'textbox1'.
The other thing is this entire thing is contained in a form which is supposed to be finally submitted to the servlet for further processing.
So how can i achieve this.
i figured out the solution to my own problem. It might not be the most elegant way of doing it, but it does the job pretty well.
So as per my requirement, what i exactly wanted to do was.... insert a value (that will be fetched from the database) into a text box on my form depending on what the user chooses from the drop down box that is already present on my form.
To achieve this, i went about and thought if some how i could nest a form withing my main form, it'd solve my issue. But i discovered that nesting of forms is not allowed. So the next option i thought of was to some how submit the same form without the user clicking on the submit button and also handle it appropriately as an 'incomplete' submit (in the sense that the form is still to be submitted manually by the user by clicking on the submit button) on the server.
So i simply made use of the 'onChange' event of a drop down box. I created an additional hidden field on my form.I wrote a simple javascript function that would simply set the value of the hidden field to the string-"partial Submit" and would submit my main form (say named 'form1') as :-
document.getElementById("hidden_id").setAttribute("value","partial submit");
form1.submit;
The function that does the above will be called whenever (and everytime) the onchange event of the drop down box gets fired.
When the user finally clicks on the submit button on the form to submit the finally completed form, then another javascript function is called that simply sets the value of the hidden field on the form to the string, "final submit" and would submit the form as :-
document.getElementById("hidden_id").setAttribute("value","final submit");
form1.submit;
Now on my server, i checked for the value of this hidden field as :-
if(request.getParameter("hidden_id").equals("partial Submit"))
{
// make a database connection, pass the value user selected from the drop down box
// to a prepared statement that does the query for getting the 'productName' from
// the database, collect the returned string in a variable and set a
// request attribute with this returned value. This value can simply be used in the
// jsp to fill in the value part of the textbox1.
}
else
{
if(request.getParameter("hidden_id").equals("final Submit"))
{
// do the rest of the final processing that needs to be done when user finally
// submits the completed form.
}
else
{
// throw an exception to take care of the possibility that the user might send
// in a 3rd value as a value for the hidden field.
}
}
Since you havent provided the code for selectProduct(this.value) , i presume that it submits the jsp page as when you change the value in the drop down.
If that the case in the servelt, set the value that you want to show in jsp in request object
request.setAttribute("valuetodisplay" ,valuetodisplay);
and now in jsp
<input type="text" value ='<%= request.getAttribute("valuetodisplay")%>' />