i have a complex table with TextField’s in it.
I want the text in the TextField automatically selected if i click on it or programatically focussed it so the user can write instantly.
i added a FocusListener on the TextField which performs a selectAll() on self - sadly selectAll() will call focus() and the FocusListener will be fired again in spite of its allready focussed. so i get a nice listener loop.
i tried to override the setSelectionRange() to avoid the focus() call but it accesses private members needed for selection so i’m stuck.
I can only come up with some sorta hacks to get around the issue. One possibility is to remove the FocusLlistener just before the selectAll() -call, and add it back straight after. Another is to have a boolean and do something like this…
onFocus ( ... ) {
if(!updating) {
updating = true;
selectAll();
updating = false;
}
}
That would not call then selectAll more than once.
I know that these are not the most pretty solutions but they might be enough in some cases and they might give you some new ideas on what to try.
I had a similar solution with a boolean variable. but this is a highly asynchronous process and i did not feel good with such a hack
sometimes i strangely run in an endless loop anyway.
i ended up integrating jQuery in vaadin. now its all fine.
im having the same problem, also getting a listener loop. Even with removing listener and adding it after calling selectAll(). Any other possibilities?
I was getting the same problem when I executed focus on a TextField when one of my custom components was built, in order for that field to have initial focus when a Window was displayed. After that, if I selected data from outside the browser window, for example, in order to copy and paste data into another TextField, the instant I clicked onto the second field, the infinite focus event loop would start for the first field. I think I was able to get around this problem with a hack where the focus listener was removed from the first TextField before executing selectAll and then was added back on a separate thread. It’s ugly, I know, but, for what it’s worth, here’s what the code looks like:
class TextFieldFocusListener implements FocusListener {
public void focus(FocusEvent event) {
Component component = event.getComponent();
if (component.equals(firstTextField)) {
firstTextField.removeListener(this);
firstTextField.selectAll();
AddListenerBackThread addListenerBackThread = new AddListenerBackThread(firstTextField, this);
addListenerBackThread.start();
}
else if (component.equals(secondTextField)) {
secondTextField.selectAll();
}
}
I had the same problem with Vaadin 7. To solve it I created a CustomTextField that extends TextField and I have rewrote the focus method like that:
public void setCallFocus(boolean callFocus){
this.callFocus = callFocus;
}
@Override
public void focus() {
if (callFocus) {
super.focus();
}
}
So you can call selectAll like that:
field.callFocus(false);//disallow call of focus method
field.selectAll();
field.callFocus(true);//reallow call of focus method