JavaFX
Campo de texto con una longitud máxima
En este ejemplo os he querido mostrar una tarea muy habitual en una aplicación que es restringir el número máximo de caracteres que se introducen en un campo de texto.
Para ello haremos uso del método addListener
de la propiedad de texto asociada al campo de texto y que nos permitirá escuchar los cambios que se vayan produciendo en la misma, de forma que si el nuevo valor ya sobrepasa el tamaño lo sustituimos por el antiguo.
La interfaz de la aplicación es el que muestra la siguiente imagen:
El código asociado sería el siguiente.
package javafx.eventos;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.recursos.LocalizadorRecursos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.AudioClip;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class CampoTextoLongitudMaxima extends Application {
private Label lbInfo;
private TextField tfTexto;
private static final int MAX_CARACTERES = 10;
private static final AudioClip BEEP = new AudioClip(LocalizadorRecursos.class.getResource("sonidos/beep.mp3").toExternalForm());
private void controlaTamanoTexto(String textoAntiguo) {
String texto = tfTexto.getText();
if (texto.length() <= MAX_CARACTERES) {
lbInfo.setText("Longitud: " + texto.length() + " caracteres");
} else {
tfTexto.setText(textoAntiguo);
BEEP.play();
}
}
@Override
public void start(Stage escenarioPrincipal) {
try {
VBox raiz = new VBox(20);
raiz.setPadding(new Insets(10));
raiz.setAlignment(Pos.CENTER);
HBox hbTexto =new HBox(30);
hbTexto.setPadding(new Insets(10));
hbTexto.setAlignment(Pos.CENTER);
Label lbTexto = new Label("Introduce texto \n(máximo " + MAX_CARACTERES + " caracteres)");
lbTexto.setWrapText(true);
lbTexto.setFont(Font.font("Arial", 14));
tfTexto = new TextField();
tfTexto.textProperty().addListener((observable, oldValue, newValue) -> controlaTamanoTexto(oldValue));
hbTexto.getChildren().addAll(lbTexto, tfTexto);
lbInfo = new Label("Longitud: 0 caracteres");
lbInfo.setFont(Font.font("Arial", 24));
raiz.getChildren().addAll(hbTexto, lbInfo);
Scene escena = new Scene(raiz, 450, 150);
escenarioPrincipal.setTitle("Texto con tamaño máximo");
escenarioPrincipal.setScene(escena);
escenarioPrincipal.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}