当前位置: 首页 > 知识库问答 >
问题:

JavaFX TextField数组文本值的最大长度

蓝星辰
2023-03-14

我正在从事一个JavaFX项目,使用TextField控件时遇到问题。我想将用户在每个文本字段中输入的字符限制为一个。如果将单个文本字段与侦听器一起使用,我找到了一个解决方案:

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);
        }
    }
});

但问题是我有一个TextFields数组。你们知道如何为TextFieldArray重写这个侦听器吗?

阵列列表实现:

static public TextField[] tfLetters = new TextField[37];

阵列初始化:

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++;
        }

    }

我使用了给定的解决方案:

Arrays.asList(tfLetters).forEach(tfLetters -> GamePresenter.addTextLimiter(tfLetters,1));

GamePresenter是编写侦听器的视图的演示者。在“GameView”视图中,我实现了文本字段数组。但现在,当我运行给定的解决方案时,会出现以下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)

游戏视图线:36

 tf.textProperty().addListener(new ChangeListener<String>() {

游戏视图行:52

Arrays.asList(tfLetters).forEach(tfLetters -> GamePresenter.addTextLimiter(tfLetters,1));

旁注:我将其公开为静态,以便在GamePresenter中使用。我对Java非常陌生。

提前感谢!

共有1个答案

章增
2023-03-14

这是一个没有GridPane的解决方案,但这是一个将字段也添加到GridPane的简单过程。现在有了更好的TextFormatter。

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);
  }
}
 类似资料:
  • 本文向大家介绍JS获取数组最大值、最小值及长度的方法,包括了JS获取数组最大值、最小值及长度的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS获取数组最大值、最小值及长度的方法。分享给大家供大家参考,具体如下: 希望本文所述对大家JavaScript程序设计有所帮助。

  • 问题 你需要找出数组中包含的最大的值。 解决方案 你可以使用 JavaScript 实现,在列表推导基础上使用 Math.max(): Math.max [12, 32, 11, 67, 1, 3]... # => 67 另一种方法,在 ECMAScript 5 中,可以使用 Array 的 reduce 方法,它与旧的 JavaScript 实现兼容。 # ECMAScript 5 [12,

  • 主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都

  • 问题内容: 我已将Java代码移植到C#。您能否在以下代码行中解释为什么我会出现编译时错误(我使用VS 2008): 无法将源类型ulong转换为目标类型long 我在这里需要与原始Java代码相同的值。 问题答案: 假设您不担心负值,可以尝试使用: 在Java中,的实际值将为,因为它将溢出最大值,因此您可以将常量替换为。

  • 问题内容: 我的代码没有给出错误,但是没有显示最小值和最大值。代码是: 我是否需要system.out.println()来显示它,否则返回应该起作用吗? 问题答案: 您正在调用方法,但不使用返回的值。

  • 这是一个非常基本的算法(不能再简单了),但我被难住了。我们有一个元素数组,我们必须确定最小值和最大值。 通常的方法是遍历数组,找出最小值和最大值,即2n比较。 稍微有效的方法是首先对数组的连续元素进行比较,以确定任意两个元素的最大值和最小值(N/2比较)。我们现在有n/2 min和n/2 max元素。现在我们可以在n/2+n/2+n/2(前一步)=3/2*n或1.5n中得到最终的max和min 那