Estoy utilizando algunos JFormattedTextFields en mi programa. Por alguna razón, cuando el campo de texto gana enfoque después de hacer clic en el campo de texto, la posición de intercalación siempre salta hacia la izquierda (posición 0). Me gustaría que el cursor finalice en la ubicación en la que el usuario hizo clic. Entonces, si hago clic entre dos dígitos, el símbolo de intercalación debería estar entre esos dos dígitos.JFormattedTextField posición de cursor en el foco
Así que implementé un FocusListener que obtendría la ubicación del clic y establecería la posición de intercalación allí.
FocusListener focusListener = new FocusListener(){
public void focusGained(FocusEvent evt) {
JFormettedTextField jftf = (JFormattedTextField) evt.getSource();
//This is where the caret needs to be.
int dot = jftf.getCaret().getDot();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
'the textField that has focus'.setCaretPosition('Some how get the evt or dot');
}
});
}
public void focusLost (FocusEvent evt) {}
});
He intentado varias cosas para que funcione. Intenté usar la palabra clave final, que funciona, pero solo para un solo campo de texto.
He utilizado los métodos set/get dentro del detector de enfoque para asignar el objeto actual, pero no estoy seguro de cómo hacer que esto sea "seguro" (por ejemplo, ¿tienen que estar sincronizados?).
Quizás haya algo que me falta?
¡Buena respuesta! ¿Pero por qué necesitas hacerlo en invokeLater()? ¿MousePressed() no se invoca desde el subproceso de evento de todos modos? – Jonas
@Sanoj, la demora introducida por 'invokeLater' es necesaria para que funcione. Normalmente, cuando se hace clic en el campo, gana foco, lo que hace que el formateador vuelva a formatear el valor y actualice el texto del campo. Un efecto colateral de eso es que el caret se mueve. Con 'invokeLater', este método' run() 'no se ejecuta hasta que se haya completado el manejo del evento de enfoque, así que sabes que una vez que coloques el cursor en el lugar correcto, permanecerá allí. – finnw
¡Gracias por la explicación! – Jonas