On Tue, Oct 12, 2010 at 10:30 AM, Shelli Orton <shelli.or...@sjrb.ca> wrote: > Thanks for the help. Your changes got rid of the errors and I can delete > records now (and the list is updated). > > However, once a record has been selected for edit and either saved or > cancelled, that same record is always displayed in the edit group when I > choose another record to edit or even when I try to create a new one. I can > even delete the chosen record and it still displays in the edit group.
works fine here, meaning you did not completely/propery apply my changes. below is the complete file. -igor public class RecordAPanel extends Panel { private static final long serialVersionUID = 1L; RecordAService recordAService; RecordBService recordBService; RecordA selectedRecordA = new RecordA(); IModel<RecordA> selectedRecordAModel; String unmodifiedRecordA; boolean isNew = false; WebMarkupContainer selectGroup; WebMarkupContainer editGroup; Form selectForm; Form editForm; DropDownChoice<RecordA> recordAs; DropDownChoice<RecordB> recordBs; Button add; Button edit; Button save; Button delete; Button cancel; Label editLegendLabel; String editLegend; Label recordALabel; Label recordBLabel; RequiredTextField recordAText; @SuppressWarnings({ "rawtypes", "unchecked" }) public RecordAPanel(String id) { super(id); recordAService = ((Application) RequestCycle.get().getApplication()).getRecordAService(); recordBService = ((Application) RequestCycle.get().getApplication()).getRecordBService(); selectedRecordAModel = new PropertyModel<RecordA>(this, "selectedRecordA"); this.setDefaultModel(selectedRecordAModel); // ************* Select Group ************* selectGroup = new WebMarkupContainer("selectGroup"); selectForm = new Form("selectForm"); recordAs = new DropDownChoice<RecordA>("recordAs"); recordAs.setModel(selectedRecordAModel); recordAs.setChoices(recordAsModel); recordAs.setChoiceRenderer(new RecordARenderer()); // recordAs = (DropDownChoice<RecordA>) new DropDownChoice<RecordA>("recordAs", // new PropertyModel<RecordA>(this, "selectedRecordA"), // recordAsModel, // new RecordARenderer()); recordAs.setNullValid(false); selectForm.add(recordAs); add = new Button("add") { private static final long serialVersionUID = 1L; public void onSubmit() { setSelectedRecordA(new RecordA()); isNew = true; editLegend = "New"; editGroup.setVisible(true); selectGroup.setVisible(false); } }; selectForm.add(add); edit = new Button("edit") { private static final long serialVersionUID = 1L; public void onSubmit() { if (selectedRecordA == null) { info("You must select a record to edit."); } else { unmodifiedRecordA = selectedRecordA.getName(); isNew = false; editLegend = "Edit"; editGroup.setVisible(true); selectGroup.setVisible(false); } } }; selectForm.add(edit); delete = new Button("delete") { private static final long serialVersionUID = 1L; public void onSubmit() { if (selectedRecordA == null) { info("You must select a record to delete."); } else { // Delete the selected record unmodifiedRecordA = selectedRecordA.getName(); recordAService.delete(selectedRecordA.getName()); selectedRecordA = null; info("Deleted '" + unmodifiedRecordA + "'"); // Force refresh of records list RecordAPanel.this.recordAsModel.detach(); } } }; // Add confirmation dialog box delete.add(new SimpleAttributeModifier("onclick", "if (!confirm('Please confirm you want to delete this record') ){ return false; }")); selectForm.add(delete); selectGroup.add(selectForm); this.add(selectGroup); // ************* Edit Group ************* editGroup = new WebMarkupContainer("editGroup"); editLegendLabel = new Label("editLegend", new PropertyModel(this, "editLegend")); editGroup.add(editLegendLabel); editForm = new Form("editForm"); recordALabel = new Label("recordALabel", "Record A"); editForm.add(recordALabel); recordBLabel = new Label("recordBLabel", "Record B"); editForm.add(recordBLabel); recordAText = new RequiredTextField("recordAText", new PropertyModel(selectedRecordAModel, "name")); editForm.add(recordAText); recordBs = new DropDownChoice<RecordB>("recordBs"); recordBs.setModel(new PropertyModel(selectedRecordAModel, "recordB")); recordBs.setChoices(RecordAPanel.this.getRecordBs()); recordBs.setChoiceRenderer(new RecordBRenderer()); editForm.add(recordBs); save = new Button("save") { private static final long serialVersionUID = 1L; @Override public void onSubmit() { if (isNew) { recordAService.create(RecordAPanel.this.selectedRecordA); info("Created '" + RecordAPanel.this.selectedRecordA.getName() + "'"); } else { recordAService.update(unmodifiedRecordA, RecordAPanel.this.selectedRecordA); info("Updated '" + RecordAPanel.this.selectedRecordA.getName() + "'"); } // TODO Update the dropdown list? editGroup.setVisible(false); selectGroup.setVisible(true); } }; editForm.add(save); cancel = new Button("cancel") { private static final long serialVersionUID = 1L; public void onSubmit() { RecordAPanel.this.selectedRecordA = null; editGroup.setVisible(false); selectGroup.setVisible(true); } }; cancel.setDefaultFormProcessing(false); editForm.add(cancel); editGroup.add(editForm); editGroup.setVisible(false); this.add(editGroup); } public RecordA getSelectedRecordA() { return selectedRecordA; } public void setSelectedRecordA(RecordA selectedRecordA) { this.selectedRecordA = selectedRecordA; } public LoadableDetachableModel<List<RecordA>> recordAsModel = new LoadableDetachableModel<List<RecordA>>() { private static final long serialVersionUID = 1L; @Override protected List<RecordA> load() { return recordAService.getList(); } public void detach() { super.detach(); } }; // TODO change this to LDM? List<RecordB> getRecordBs() { return recordBService.getList(); } class RecordARenderer implements IChoiceRenderer<RecordA> { private static final long serialVersionUID = 1L; public Object getDisplayValue(RecordA recordA) { return recordA.getName(); } public String getIdValue(RecordA recordA, int index) { return recordA.getName(); } } class RecordBRenderer implements IChoiceRenderer<RecordB> { private static final long serialVersionUID = 1L; public Object getDisplayValue(RecordB recordB) { return recordB.getName(); } public String getIdValue(RecordB recordB, int index) { return recordB.getName(); } } } > > Shelli > > -----Original Message----- > From: Igor Vaynberg [mailto:igor.vaynb...@gmail.com] > Sent: Tuesday, October 12, 2010 10:38 AM > To: users@wicket.apache.org > Subject: Re: PropertyModel Not Refreshing > > here are the tweaks you need to make this work: > > selectedRecordAModel = new PropertyModel<RecordA>(this, "selectedRecordA"); > > recordAText = new RequiredTextField("recordAText", > new PropertyModel(selectedRecordAModel, "name")); > > recordBs.setModel(new PropertyModel(selectedRecordAModel, "recordB")); > > have fun > > -igor > > On Tue, Oct 12, 2010 at 9:03 AM, Shelli Orton <shelli.or...@sjrb.ca> wrote: >> I've been able to create a sample application that exhibits the >> same/similar problems to mine. The sample makes use of an in-memory >> list for the data versus accessing a database and so there's some >> differences. However, I believe the problems that this sample exhibits >> have the same root cause as my project (which I believe have something >> to do with how my models are set up...). >> >> Issues this sample exhibits: >> >> 1. Choose to edit an existing record, then cancel the edit. Choose >> another/the same record to edit and the selected record is null (error >> message "You must select a record to edit" is displayed). Must >> close/open session to reset. >> >> 2. Choose to edit an existing record and save the edit. Choose >> another/the same record to edit and you get a NPE: >> >> WicketMessage: Method onFormSubmitted of interface >> org.apache.wicket.markup.html.form.IFormSubmitListener targeted at >> component [MarkupContainer [Component id = selectForm]] threw an >> exception >> >> Root cause: >> >> java.lang.NullPointerException >> at >> org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.convertCho >> iceIdToChoice(AbstractSingleSelectChoice.java:247) >> >> 3. Create a new record and try to save it and get >> WicketRuntimeException: >> >> WicketMessage: Attempted to set property value on a null object. >> Property expression: name Value: New One >> >> Root cause: >> >> org.apache.wicket.WicketRuntimeException: Attempted to set property >> value on a null object. Property expression: name Value: New One >> at >> org.apache.wicket.util.lang.PropertyResolver.setValue(PropertyResolver.j >> ava:125) >> >> 4. Create a new record and then cancel the add, Choose an existing >> record to edit and the selected record is null (error message "You must >> select a record to edit" is displayed). Must close/open session to >> reset. >> >> As always, all help is greatly appreciated as I am stumped. >> >> Thanks, >> Shelli >> >> -----Original Message----- >> From: jcgarciam [mailto:jcgarc...@gmail.com] >> Sent: Friday, October 08, 2010 1:41 PM >> To: users@wicket.apache.org >> Subject: Re: PropertyModel Not Refreshing >> >> >> The attachment didn't make it, >> >> Can you try to extract out the relevant part and creates a quickstart >> project that actually reproduces your issue? >> >> >> On Fri, Oct 8, 2010 at 1:41 PM, Shelli Orton [via Apache Wicket] < >> ml-node+2968688-305091622-65...@n4.nabble.com<ml-node%2B2968688-30509162 >> 2-65...@n4.nabble.com> >>> wrote: >> >>> Hi, >>> >>> I have been trying different things to see if I could get my code to >> work >>> (and understand Wicket models better), but am still stuck. I have a >>> attached the (latest) panel class code which I hope is sufficient to >> help. >>> >>> I was reading about different models (both online and the Wicket in >> Action >>> book) and thought that perhaps using a CompoundPropertyModel was more >>> appropriate and may help with my issues. Originally, I only declared >>> selectedRecordA (line 40) but didn't instantiate it. The select group >>> displayed properly but when I chose a record from the list and tried >> to edit >>> it, this exception was thrown: >>> >>> WicketMessage: Attempted to set property value on a null object. >>> Property expression: recordA Value: Name=A-One >>> Root cause: >>> >>> org.apache.wicket.WicketRuntimeException: Attempted to set >> property >>> value on a null object. Property expression: recordA Value: Name=A-One >>> at >>> >> org.apache.wicket.util.lang.PropertyResolver.setValue(PropertyResolver.j >> ava:125) >>> >>> at >>> >> org.apache.wicket.model.AbstractPropertyModel.setObject(AbstractProperty >> Model.java:169) >>> >>> at >>> org.apache.wicket.Component.setDefaultModelObject(Component.java:3125) >>> .... >>> >>> I set breakpoints on the getSelectedRecordA and setSelectedRecordA >> methods, >>> but these aren't called when during the request cycle when the edit >> button >>> is clicked. >>> >>> I then changed the class so that selectedRecordA is initialized to an >> empty >>> instance of RecordA. This got rid of the above error. However, I >> cannot >>> save the edit changes because the selectedRecordA is still the empty >>> instance that was created in the initialization and the persistence >> layer >>> throws an exception. This same problem exists if I try to add a new >> RecordA >>> or try to delete an existing one. >>> >>> If I choose to cancel the edit and then select another record to edit, >> I >>> get the message "You must select a record to edit" (line 131). This >> is >>> because the cancel onSubmit sets selectedRecordA to null and choosing >> the >>> record from the DDC is not setting it to the chosen record. >>> >>> Clearly I am not setting up this CompoundPropertyModel properly so >> that the >>> selectedARecord is set by the model. Can someone tell me what I'm >> doing >>> wrong? >>> >>> All help is greatly appreciated, >>> >>> Shelli >>> >>> >>> -----Original Message----- >>> From: Igor Vaynberg [mailto:[hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=0>] >>> >>> Sent: Thursday, October 07, 2010 11:27 AM >>> To: [hidden email] >> <http://user/SendEmail.jtp?type=node&node=2968688&i=1> >>> Subject: Re: PropertyModel Not Refreshing >>> >>> you have posted an incomplete piece of code and somehow from that we >>> are supposed to guess what is not working? create a quickstart and >>> provide that. >>> >>> -igor >>> >>> On Thu, Oct 7, 2010 at 10:15 AM, Shelli Orton <[hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=2>> >>> wrote: >>> >>> > Does nobody have any suggestions? If I can't get this fixed, I'm >> going >>> > to have to write the app in another framework (possibly GWT) and I'd >>> > really rather not have to do that. >>> > >>> > Shelli >>> > >>> > -----Original Message----- >>> > From: Shelli Orton >>> > Sent: Wednesday, October 06, 2010 3:52 PM >>> > To: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=3> >>> > Subject: PropertyModel Not Refreshing >>> > >>> > Hi, >>> > >>> > First, thanks to all who have been helping me as I am new to Wicket. >> I >>> > am splitting out two issues I am dealing with to try to keep things >>> > clear. >>> > >>> > I am trying to write a simple app that does CRUD operations on >> database >>> > records. The goal is for the app to make use of a tab panel where >> each >>> > tab encapsulates one table from the database. Each tab panel has >> two >>> > groups (WebMarkupContainer). The first, selectGroup, displays a >> list >>> > (DDC) of the current items, and three buttons, add, edit and delete. >>> > The second, editGroup, is displayed when either the add or edit >> button >>> > was clicked on the select group, displays the record attributes and >> save >>> > and cancel buttons. The tab panel has a "selectedRecord" which is >> used >>> > by both groups' components via PropertyModels. Very basic stuff. >>> > >>> > When I choose a record and click the edit button, the record is >>> > displayed in the edit group properly. If I then choose cancel, the >> edit >>> > group is no longer displayed and the select group DDC selection is >> null >>> > as expected. I then choose another record from the list and click >> the >>> > edit button and the previous record information is displayed in the >> edit >>> > group even though the select group DDC shows the correct/selected >>> > record. >>> > >>> > This problem also occurs if I first choose to add a new record and >> then >>> > cancel the add and then choose to edit a different record. The DDC >>> > shows the correct/selected record, but all the attributes in the >> edit >>> > group are null/defaults for a new record. >>> > >>> > If I remove the call to setDefaultFormProcessing(false) on the >> cancel >>> > button, selecting other records for edit works correctly, but I >> can't >>> > cancel a creating a new record if I use a RequiredTextField because >> the >>> > form validation fails. >>> > >>> > If I select a record for editing or save the newly created record, I >> can >>> > select a different record for edit or create another one correctly. >> So >>> > I must be doing something wrong in the cancel logic. My editForm >>> > (created in the EditGroup constructor) looks like this: >>> > >>> > Form editForm = new Form("editForm"); >>> > >>> > editForm.add(new Label("nameLabel", "Name")); >>> > >>> > editForm.add(new Label("attributeLabel", "Attribute")); >>> > >>> > editForm.add(new >> RequiredTextField<String>("recordNameText", >>> > new PropertyModel<String>(MyRecordPanel.this, >>> > "selectedRecord.name"))); >>> > >>> > editForm.add(new DropDownChoice<Lir>("attributes", >>> > new PropertyModel<Attribute>(MyRecordPanel.this, >>> > "selectedRecord.attribute"), >>> > RateCentrePanel.this.getAttributes(), >>> > new AttributeRenderer())); >>> > >>> > .... >>> > >>> > editForm.add(new Button("cancel") >>> > { >>> > private static final long serialVersionUID = 1L; >>> > >>> > public void onSubmit() >>> > { >>> > MyRecordPanel.this.selectedRecord = null; >>> > editGroup.setVisible(false); >>> > selectGroup.setVisible(true); >>> > } >>> > }.setDefaultFormProcessing(false)); >>> > >>> > add(editForm); >>> > >>> > Other than setting the selectedRecord to null, what should I be >> doing >>> > differently? >>> > >>> > Thanks in advance! >>> > >>> > Shelli >>> > >>> > >> --------------------------------------------------------------------- >>> > To unsubscribe, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=4> >>> > For additional commands, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=5> >>> > >>> > >>> > >> --------------------------------------------------------------------- >>> > To unsubscribe, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=6> >>> > For additional commands, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=7> >>> > >>> > >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=8> >>> For additional commands, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=9> >>> >>> >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=10> >>> For additional commands, e-mail: [hidden >> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=11> >>> >>> ------------------------------ >>> View message @ >>> >> http://apache-wicket.1842946.n4.nabble.com/DropDownChoice-Model-Confusio >> n-tp2955144p2968688.html >>> To start a new topic under Apache Wicket, email >>> >> ml-node+1842946-398011874-65...@n4.nabble.com<ml-node%2B1842946-39801187 >> 4-65...@n4.nabble.com> >>> To unsubscribe from Apache Wicket, click >> here<http://apache-wicket.1842946.n4.nabble.com/template/TplServlet.jtp? >> tpl=unsubscribe_by_code&node=1842946&code=amNnYXJjaWFtQGdtYWlsLmNvbXwxOD >> QyOTQ2fDEyNTYxMzc3ODY=>. >>> >>> >>> >> >> >> -- >> Sincerely, >> JC (http://www.linkedin.com/in/jcgarciam) >> Work smarter, not harder!. >> >> -- >> View this message in context: >> http://apache-wicket.1842946.n4.nabble.com/DropDownChoice-Model-Confusio >> n-tp2955144p2968936.html >> Sent from the Users forum mailing list archive at Nabble.com. >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org >> For additional commands, e-mail: users-h...@wicket.apache.org >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org >> For additional commands, e-mail: users-h...@wicket.apache.org >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org