java - resultado - texto de fondo en jtextfield
¿Cómo seleccionar todo el texto en un JFormattedTextField cuando se enfoca? (5)
Tengo una pequeña aplicación de escritorio Java que usa Swing. Hay un cuadro de diálogo de entrada de datos con algunos campos de entrada de diferentes tipos (JTextField, JComboBox, JSpinner, JFormattedTextField). Cuando activo JFormattedTextFields, ya sea tabulando el formulario o haciendo clic con el mouse, me gustaría seleccionar todo el texto que contiene actualmente. De esta forma, los usuarios podrían comenzar a escribir y sobrescribir los valores predeterminados.
¿Cómo puedo hacer eso? Utilicé FocusListener / FocusAdapter que llama a selectAll () en JFormattedTextField, pero no selecciona nada, aunque se llama al método FocusGained () del FocusAdapter (ver ejemplo de código a continuación).
private javax.swing.JFormattedTextField pricePerLiter;
// ...
pricePerLiter.setFormatterFactory(
new JFormattedTextField.AbstractFormatterFactory() {
private NumberFormatter formatter = null;
public JFormattedTextField.AbstractFormatter
getFormatter(JFormattedTextField jft) {
if (formatter == null) {
formatter = new NumberFormatter(new DecimalFormat("#0.000"));
formatter.setValueClass(Double.class);
}
return formatter;
}
});
// ...
pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
pricePerLiter.selectAll();
}
});
¿Algunas ideas? Lo curioso es que la selección de todo su texto aparentemente es el comportamiento predeterminado tanto para JTextField como para JSpinner, al menos cuando se tabula a través del formulario.
Además de lo anterior, si desea esto para todos los campos de texto, puede hacer lo siguiente:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener()
{
public void propertyChange(final PropertyChangeEvent e)
{
if (e.getNewValue() instanceof JTextField)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JTextField textField = (JTextField)e.getNewValue();
textField.selectAll();
}
});
}
}
});
El código de camickr puede mejorarse ligeramente. Cuando el foco pasa de un JTextField a otro tipo de componente (como un botón), la última selección automática no se borra. Se puede arreglar de esta manera:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener()
{
@Override
public void propertyChange(final PropertyChangeEvent e)
{
if (e.getOldValue() instanceof JTextField)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JTextField oldTextField = (JTextField)e.getOldValue();
oldTextField.setSelectionStart(0);
oldTextField.setSelectionEnd(0);
}
});
}
if (e.getNewValue() instanceof JTextField)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JTextField textField = (JTextField)e.getNewValue();
textField.selectAll();
}
});
}
}
});
Envuelva su llamada con SwingUtilities.invokeLater por lo que sucederá después de que se hayan procesado todos los eventos AWT pendientes:
pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
pricePerLiter.selectAll();
}
});
}
});
Eso es porque JFormattedTextfield reemplaza a processFocusEvent para formatear en foco ganado / foco perdido.
Una forma segura de tomar medidas es extender JFormattedTextField y anular el método processFocusEvent:
new JFormattedTextField("...") {
protected void processFocusEvent(FocusEvent e) {
super.processFocusEvent(e);
if (e.isTemporary())
return;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
selectAll();
}
});
}
};
Usar un focusListener puede no funcionar siempre ... ya que dependerá de la hora a la que se llame en relación con el processFocusEvent.
Sé que esto es algo viejo, pero se me ocurrió una solución más limpia, sin invocar Más:
private class SelectAllOfFocus extends FocusAdapter {
@Override
public void focusGained(FocusEvent e) {
if (! e.isTemporary()) {
JFormattedTextField textField = (JFormattedTextField)e.getComponent();
// This is needed to put the text field in edited mode, so that its processFocusEvent doesn''t
// do anything. Otherwise, it calls setValue, and the selection is lost.
textField.setText(textField.getText());
textField.selectAll();
}
}
}