Hi Janak Unfortunately this does not completely solve my problem.
I would have like to have used the focusLost event but can't as I need to know when a field changes The focus lost fires every time navigate moves from or to an item. For example. If have a validation routine that checks the entered value against the database and if it is not unique then I need to show the user a list of valid values to choose from. This validation should only occur if the user has made changes to the field. I also call other validation routines when a user changes a value. Again, these validation routines should only fire if actual changes were made. I could store two values for each text field and then check one against the other, but obviously this is not a good idea. I like idea to use the ULC Enablers but I have a problem with them. The enablers only check for values entered into a field. This would solve half of my problem, but I also have the validation routines that are fired and depending on whether the validation routine was successful I am also enabling buttons. Therefore I have the following scenario: I have an edit screen with different fields, some editable some display only, some of the fields are mandatory and some have validation routines attached. Only when all mandatory fields have been entered and the validation routines are successful do I enable the "ok" button. I can use the enablers for the mandatory fields but not the fields that have a validation routine attached. Using the InputVerifier will not work as I am not stopping the users from entering a certain value, I just need to react when they do add a value. It looks as if I am not able to construct what I need without a round trip and therefore executing the value changed event. I think it would be a good idea to update the JavaDoc for the ValueChangedEvent as there it does not mention the "problem" with a round trip causing the event to fire. I personally think it is a bug that the value changed is sent with every round trip. I think it should work the same as written in the JavaDoc. Otherwise nobody can ever be sure when the event will actually fire. Paul -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Janak Mulani Sent: Mittwoch, 3. Februar 2010 17:45 To: [email protected] Subject: RE: [ULC-developer] Text Field and Value changed event Hi Paul, > I use the value changed event to see that the user has > modified a text field. This should only be done when the > focus leaves the item so that validation can be performed. valueChanged event will be fired when value has changed on the client and there is a roundtrip even when focus has not been lost. In your case key listener on client is generating a roundtrip. If you don't want to validate during this roundtrip then you can set a flag in your special event listener and ignore validation in valueChanged event listener based on this flag. I > would also like to know when the user types value into the > item. This way I can set mandatory flags on the screen. You can use ULCHasChangedEnabler and ULCMandatoryAndEnabler for this purpose. > don't want to send key listeners to the server for obvious > performance reasons. I therefore came up with the idea to > send just two events from the client to the server, when the > value changes from null/empty to a value or when the value > changes from a value to null/empty. This way I need only send > two events to the client. If your validation is syntactic in nature i.e. checks for null value or only alphanumeric etc then you can use InputVerifier on the client side: http://lists.canoo.com/mailman/private/ulc-developer/2006/004888.html You can keep track on the server side of the fact whether value changed from null to something or something to null using the following extension: public class MyULCTextField extends ULCTextField { public MyULCTextField(String string) { super(string); } public MyULCTextField(int i) { super(i); } private Object fLastValue; @Override protected void updateValue(Object value) { fLastValue = getValue(); super.updateValue(value); System.out.println("Last val " + fLastValue + " New val " + getValue()); } } The updateValue method is called during a roundtrip if the textfield has changed on the client. Thanks and regards, Janak ----------------------------------------- Janak Mulani email: [email protected] url: http://www.canoo.com Beyond AJAX - Java Rich Internet Applications http://www.canoo.com/ulc ----------------------------------------- > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of > Paul Harrison > Sent: Tuesday, February 02, 2010 5:42 PM > To: '[email protected]'; '[email protected]' > Subject: RE: [ULC-developer] Text Field and Value changed event > > Hi Janek > > Yes, I thought that this was happening. > > My requirement is this: > > I use the value changed event to see that the user has > modified a text field. This should only be done when the > focus leaves the item so that validation can be performed. I > would also like to know when the user types value into the > item. This way I can set mandatory flags on the screen. I > don't want to send key listeners to the server for obvious > performance reasons. I therefore came up with the idea to > send just two events from the client to the server, when the > value changes from null/empty to a value or when the value > changes from a value to null/empty. This way I need only send > two events to the client. > > Paul > > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of Janak Mulani > Sent: Dienstag, 2. Februar 2010 17:31 > To: [email protected] > Subject: RE: [ULC-developer] Text Field and Value changed event > > Hi Paul, > > > ValueChanged event. The ValueChanged event should only be > > sent to the client when focus leaves the item, which is not > happening. > > We fixed the following bug: > > https://www.canoo.com/jira/browse/UBA-7287 > > If while editing a text field there is a roundtrip (like your custom > event), the textfield flushes the data and since that changes > the value on > the server side it follows that the valueChanged event is fired. > > Can you tell me what is your exact requirement? May be I can > suggest an > alternative. > > BTW, we will look into your premium list problem. > > Thanks and regards, > > Janak > > ----------------------------------------- > Janak Mulani > > email: [email protected] > url: http://www.canoo.com > > Beyond AJAX - Java Rich Internet Applications > > http://www.canoo.com/ulc > ----------------------------------------- > > > -----Original Message----- > > From: Paul Harrison [mailto:[email protected]] > > Sent: Tuesday, February 02, 2010 4:09 PM > > To: '[email protected]' > > Subject: RE: [ULC-developer] Text Field and Value changed event > > > > Dear Janak > > > > Unfortunately the error is still there. I have changed my > > code to use the code example you give below. I get the event > > sent to the server as expected, but the problem exists that > > when the ActionEvent comes to the server, so does the > > ValueChanged event. The ValueChanged event should only be > > sent to the client when focus leaves the item, which is not > happening. > > > > Janka, I have sent the reply originally to the Developer List > > from my work account ([email protected]) but I got the > > standard reply indicating that I have not yet registered. > > > > Paul > > > > > > > > -----Original Message----- > > From: [email protected] > > [mailto:[email protected]] On Behalf Of > Janak Mulani > > Sent: Dienstag, 2. Februar 2010 11:34 > > To: [email protected] > > Subject: RE: [ULC-developer] Text Field and Value changed event > > > > > > Hi Paul, > > > > Firstly we have updated our records and your should be able > to post on > > premium list. > > > > Secondly, it seems that you have created your own event > > category. Please > > see section 4.3 of ULC Extension Guide that describes > > creating a custom > > event type. > > > > From your code snippets, I have created a sample (see below) > > which has the > > key and mouse listeners on the client side but which fires an > > ActionEvent > > (one of the predefined event categories). It works fine. > > > > Thanks and regards, > > > > Janak > > > > ----------------------------------------- > > Janak Mulani > > > > email: [email protected] > > url: http://www.canoo.com <http://www.canoo.com/> > > > > Beyond AJAX - Java Rich Internet Applications > > > > http://www.canoo.com/ulc > > ----------------------------------------- > > ________________________________ > > > > From: [email protected] > > [mailto:[email protected]] On Behalf Of > > Paul Harrison > > Sent: Monday, February 01, 2010 11:54 AM > > To: '[email protected]' > > Subject: [ULC-developer] Text Field and Value changed event > > > > Hi all > > > > I have a ULCTextField that I have created an extension to its > > client couterpart, the UITextField. > > > > My UITextfield extends the standard one because I need > > three extra > > events. A mouse double click and a value from and value to > > null event. > > > > The double click listener is working just fine but I am having > > problems with my valueFromNullEvent and the valueToNullEvent. > > The events > > themselves work just fine, the only problem is, is that > when I send my > > event to the server, it also invokes the ValueChangedEvent. The > > ValueChangedEvent normally only gets fired once focus leaves > > the field. I > > have not left the field and I have no server code that would > > force a focus > > changed. > > > > my client code is as follows: > > > > protected void postInitializeState() > > { > > super.postInitializeState(); > > > > _borderManager = new BorderManager(this); > > getBasicTextField().addKeyListener(new KeyListener() > > { > > public void keyTyped(KeyEvent e) > > { > > if (Character.isLetterOrDigit(e.getKeyChar())) > > { > > if (getBasicTextField().getText() == null || > > getBasicTextField().getText().trim().length() == 0) > > { > > > > fireEventULC(SPRINT_VALUE_CHANGED_FROM_NULL_EVENT, > > SPRINT_VALUE_CHANGED_FROM_NULL_EVENT, new Object[] {}); > > } > > } > > } > > > > public void keyReleased(KeyEvent e) > > { > > if (getBasicTextField().getText() == null || > > getBasicTextField().getText().length() == 0) > > { > > fireEventULC(SPRINT_VALUE_CHANGED_TO_NULL_EVENT, > > SPRINT_VALUE_CHANGED_TO_NULL_EVENT, new Object[] {}); > > } > > } > > > > public void keyPressed(KeyEvent e) > > { > > } > > }); > > > > > > > > getBasicTextField().addMouseListener(new MouseListener() > > { > > public void mouseClicked(MouseEvent e) > > { > > if (e.getClickCount() == 2) > > { > > fireEventULC(SPRINT_DOUBLE_CLICK_EVENT, > > "doubleClicked", new Object[] {}); > > } > > } > > > > .... > > > > .... > > > > .... > > > > > > > > It seems to me that the KexEvents are logged by ULC to > > be able to > > know if a value has changed. Because I have my own key > listener which > > fires its own event, it seems to get in the way of the > > valuechanged event. > > I tried printing out the isValueChangedEventPending() > value but it is > > false. > > > > Could you please tell me if I am doing something wrong > > or if this > > is standard behaviour. If it is standard behaviour then the > > Java Doc of > > the ValueChangedEvent is incorrect and I would be very > grateful for a > > workaround. > > > > Kins regards > > > > Paul Harrison > > -------------------------------- > > > > > > import java.awt.event.KeyEvent; > > import java.awt.event.KeyListener; > > import java.awt.event.MouseAdapter; > > import java.awt.event.MouseEvent; > > > > import com.ulcjava.base.application.AbstractApplication; > > import com.ulcjava.base.application.ULCBoxPane; > > import com.ulcjava.base.application.ULCContainer; > > import com.ulcjava.base.application.ULCFrame; > > import com.ulcjava.base.application.ULCTextField; > > import com.ulcjava.base.application.event.ActionEvent; > > import com.ulcjava.base.application.event.IActionListener; > > import com.ulcjava.base.application.event.IValueChangedListener; > > import com.ulcjava.base.application.event.ValueChangedEvent; > > import com.ulcjava.base.client.UITextField; > > import com.ulcjava.base.development.DevelopmentRunner; > > import com.ulcjava.base.shared.UlcEventCategories; > > > > > > public class TextFieldWithKeyMouseListener extends > > AbstractApplication { > > > > public void start() { > > ULCFrame frame = new > > ULCFrame("TextFieldWithKeyMouseListener"); > > frame.setDefaultCloseOperation(ULCFrame.TERMINATE_ON_CLOSE); > > frame.getContentPane().add(createView()); > > frame.setSize(200, 200); > > frame.setVisible(true); > > > > } > > > > public ULCContainer createView() { > > ULCBoxPane hBox = new ULCBoxPane(true); > > > > TextFieldActionListener actionListener = new > > TextFieldActionListener(); > > > > ULCTextField textField = new MyULCTextField(10); > > textField.addActionListener(actionListener); > > textField.addValueChangedListener(new > > IValueChangedListener() { > > public void valueChanged(ValueChangedEvent event) { > > System.out.println(".valueChanged()"); > > } > > }); > > > > ULCTextField textField2 = new ULCTextField(10); > > textField2.addActionListener(actionListener); > > > > hBox.add(textField); > > hBox.add(textField2); > > return hBox; > > } > > > > private class TextFieldActionListener implements > IActionListener { > > public void actionPerformed(ActionEvent event) { > > System.out.println("Action event : " + > > event.getActionCommand()); > > } > > } > > > > public static void main(String[] args) { > > > > DevelopmentRunner.setApplicationClass(TextFieldWithKeyMouseLis > > tener.class) > > ; > > DevelopmentRunner.main(args); > > } > > > > public static class MyULCTextField extends ULCTextField { > > public MyULCTextField(String string) { > > super(string); > > } > > > > public MyULCTextField(int i) { > > super(i); > > } > > > > protected String typeString() { > > return MyUITextField.class.getName(); > > } > > } > > > > public static class MyUITextField extends UITextField { > > > > @Override > > protected void postInitializeState() { > > super.postInitializeState(); > > getBasicTextField().addKeyListener(new KeyListener() { > > public void keyTyped(KeyEvent e) { > > if (Character.isLetterOrDigit(e.getKeyChar())) { > > if (getBasicTextField().getText() == null || > > getBasicTextField().getText().trim().length() == 0) { > > > > fireEventULC(UlcEventCategories.ACTION_EVENT_CATEGORY, > > "actionPerformed", > > new Object[] { > > > > "SPRINT_VALUE_CHANGED_TO_NULL_EVENT", > > new Integer(0) }); > > // > > fireEventULC(SPRINT_VALUE_CHANGED_FROM_NULL_EVENT, > > SPRINT_VALUE_CHANGED_FROM_NULL_EVENT, > > // new Object[] {}); > > } > > } > > } > > > > public void keyReleased(KeyEvent e) { > > if (getBasicTextField().getText() == null || > > getBasicTextField().getText().length() == 0) { > > > > fireEventULC(UlcEventCategories.ACTION_EVENT_CATEGORY, > > "actionPerformed", > > new Object[] { > > > > "SPRINT_VALUE_CHANGED_TO_NULL_EVENT", new > > Integer(0) }); > > // > > fireActionPerformedULC(event.getActionCommand(), > > getCurrentModifiers()); > > // > > fireEventULC(SPRINT_VALUE_CHANGED_TO_NULL_EVENT, > > SPRINT_VALUE_CHANGED_TO_NULL_EVENT, > > // new Object[] {}); > > } > > } > > > > public void keyPressed(KeyEvent e) { > > } > > }); > > > > getBasicTextField().addMouseListener(new > MouseAdapter() { > > public void mouseClicked(MouseEvent e) { > > if (e.getClickCount() == 2) { > > > > > > fireEventULC(UlcEventCategories.ACTION_EVENT_CATEGORY, > > "actionPerformed", > > new Object[] { > > "doubleClicked", new Integer(0) }); > > // fireEventULC(SPRINT_DOUBLE_CLICK_EVENT, > > "doubleClicked", new Object[] {}); > > } > > } > > > > }); > > } > > } > > } > > _______________________________________________ > > ULC-developer mailing list > > [email protected] > > http://lists.canoo.com/mailman/listinfo/ulc-developer > > > _______________________________________________ > ULC-developer mailing list > [email protected] > http://lists.canoo.com/mailman/listinfo/ulc-developer > _______________________________________________ > ULC-developer mailing list > [email protected] > http://lists.canoo.com/mailman/listinfo/ulc-developer > _______________________________________________ ULC-developer mailing list [email protected] http://lists.canoo.com/mailman/listinfo/ulc-developer _______________________________________________ ULC-developer mailing list [email protected] http://lists.canoo.com/mailman/listinfo/ulc-developer
