Formato de número de campo de texto JavaFX

Sheeraz Gul 15 febrero 2024
Formato de número de campo de texto JavaFX

La clase TextFormatter se utiliza para crear campos con determinados formatos. También se puede usar para crear un campo de texto numérico en JavaFX.

Este tutorial demuestra cómo crear un campo de texto numérico en JavaFX.

Formato numérico de campo de texto JavaFX

JavaFX.scene.control.TextFormatter<V> se usa para crear campos con ciertos formatos. El Formatter describe un formato de texto TextInputControl con dos estructuras diferentes.

Uno es un filtro getFilter() para modificar la entrada del usuario, y el otro es un convertidor de valores getValueConverter() que se utiliza para proporcionar un formato especial que representa un valor de tipo V. El TextFormatter se puede crear solo con el filtro y el convertidor de valores.

La sintaxis de TextFormatter es:

TextFormatter<Integer> Text_Formatter = new TextFormatter<Integer>(String_Converter, 0, Integer_Filter);
Numeric_Field.setTextFormatter(Text_Formatter);

El TextFormatter puede ser un número entero o cualquier otro tipo, y el método setTextFormatter se usa para aplicar el TextFormatter al campo.

Probemos un ejemplo para crear un campo de texto numérico:

package delftstack;

import java.util.function.UnaryOperator;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import javafx.util.converter.IntegerStringConverter;

public class Numeric_TextField extends Application {
  @Override
  public void start(Stage Demo_Stage) {
    TextField Numeric_Field = new TextField();
    UnaryOperator<Change> Integer_Filter = change -> {
      String Demo_Text = change.getControlNewText();
      if (Demo_Text.matches("-?([1-9][0-9]*)?")) {
        return change;
      } else if ("-".equals(change.getText())) {
        if (change.getControlText().startsWith("-")) {
          change.setText("");
          change.setRange(0, 1);
          change.setCaretPosition(change.getCaretPosition() - 2);
          change.setAnchor(change.getAnchor() - 2);
          return change;
        } else {
          change.setRange(0, 0);
          return change;
        }
      }
      return null;
    };

    StringConverter<Integer> String_Converter = new IntegerStringConverter() {
      @Override
      public Integer fromString(String s) {
        if (s.isEmpty())
          return 0;
        return super.fromString(s);
      }
    };

    TextFormatter<Integer> Text_Formatter =
        new TextFormatter<Integer>(String_Converter, 0, Integer_Filter);
    Numeric_Field.setTextFormatter(Text_Formatter);

    // demo listener:
    Text_Formatter.valueProperty().addListener(
        (obs, oldValue, newValue) -> System.out.println(newValue));

    VBox VBox_Root = new VBox(5, Numeric_Field, new Button("Click Here"));
    VBox_Root.setAlignment(Pos.CENTER);
    Scene scene = new Scene(VBox_Root, 300, 120);
    Demo_Stage.setScene(scene);
    Demo_Stage.show();
  }

  public static void main(String[] args) {
    launch(args);
  }
}

El código anterior usa un Operador Unario para el filtro y StringConverter como valor. El código usa TextFormatter para crear un campo de texto que solo tomará los valores enteros.

Ver salida:

Campo de texto numérico de JavaFX

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Artículo relacionado - Java JavaFX