lista - JavaFX TextField Array max longitud de valor de texto
placeholder javafx (1)
Esta es una solución sin un GridPane, pero este es un proceso fácil de agregar los Campos también a un GridPane. Y ahora con un TextFormatter que es mucho mejor.
import java.util.ArrayList;
import java.util.List;
import java.util.function.UnaryOperator;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ChangeListenerDemo extends Application {
@Override
public void start(Stage primaryStage) {
List<TextField> fields = createLimitedTextFields(9, 1);
VBox box = new VBox();
box.getChildren().addAll(fields);
Scene scene = new Scene(box, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
private List<TextField> createLimitedTextFields(int num, int maxLength) {
final List<TextField> fields = new ArrayList<>();
final UnaryOperator<TextFormatter.Change> filter
= (TextFormatter.Change change) -> {
if (change.getControlNewText().length() > maxLength) {
return null;
}
return change;
};
for (int i = 0; i < num; i++) {
final TextField tf = new TextField();
tf.setTextFormatter(new TextFormatter(filter));
fields.add(tf);
}
return fields;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
Estoy trabajando en un proyecto JavaFX y tengo un problema con el control TextField. Quiero limitar los caracteres que los usuarios ingresarán a cada campo de texto a uno. Encontré una solución si usa un solo campo de texto con un Oyente:
public static void addTextLimiter(final TextField tf, final int maxLength) {
tf.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {
if (tf.getText().length() > maxLength) {
String s = tf.getText().substring(0, maxLength);
tf.setText(s);
}
}
});
Pero el problema es que tengo una matriz de campos de texto. ¿Ustedes saben cómo puedo volver a escribir este oyente para un TextFieldArray?
Implementación de la lista de arreglos:
static public TextField[] tfLetters = new TextField[37];
Inicialización de la matriz:
private void layoutNodes() {
int letternummer = 0;
for (int i = 1; i < 8; i++) {
for (int j = 0; j < i + 1; j++) {
this.tfLetters[letternummer] = new TextField("Letter " + i);
this.add(tfLetters[letternummer], j, i);
tfLetters[letternummer].setPadding(new Insets(5, 30, 5, 5));
tfLetters[letternummer].setAlignment(Pos.CENTER);
tfLetters[letternummer].setMinSize(10, 10);
letternummer++;
}
}
Usé la solución dada:
Arrays.asList(tfLetters).forEach(tfLetters -> GamePresenter.addTextLimiter(tfLetters,1));
GamePresenter es el presentador de la vista donde está escrito el Oyente. En la vista "GameView" he implementado la matriz de campos de texto. Pero ahora cuando ejecuto la solución dada voy a la siguiente NullPointerException:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at be.kdg.letterpyramide.view.GameView.GamePresenter.addTextLimiter(GamePresenter.java:36)
at be.kdg.letterpyramide.view.GameView.GameView.lambda$layoutNodes$0(GameView.java:52)
at java.util.Arrays$ArrayList.forEach(Arrays.java:3880)
Línea GameView: 36
tf.textProperty().addListener(new ChangeListener<String>() {
Línea GameView: 52
Arrays.asList(tfLetters).forEach(tfLetters -> GamePresenter.addTextLimiter(tfLetters,1));
Sidenote: Lo hice público estático para que pueda usarlo en mi GamePresenter. Soy muy nuevo en Java.
¡Gracias por adelantado!