首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何限制文本区域上的用户输入以匹配JavaFX中的特定字符串?

如何限制文本区域上的用户输入以匹配JavaFX中的特定字符串?
EN

Stack Overflow用户
提问于 2019-12-15 23:16:46
回答 1查看 239关注 0票数 0

我需要记住大约3页的文字逐字,包括标点符号。我试图建立一个简单的JavaFX程序来测试我自己的这些材料。

我想为用户输入一个文本区域。用户将键入文本区域--如果输入与现有字符串(我需要记住的内容)正确匹配,则允许将文本作为文本字段的输入。如果他们犯了错误,输入就不会被识别,文本区域也不会出现不正确的输入。

做这种事最好的方法是什么?总的来说,我对JavaFX和Java非常陌生。我已经在JavaFX中设置了UI,我只是不知道如何在文本区域实现检查。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-16 06:35:07

一种选择是使用TextFormatter,它只允许与预期文本相似的新文本。这里有一个概念的证明

代码语言:javascript
运行
复制
import java.util.Objects;
import java.util.function.UnaryOperator;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

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

  @Override
  public void start(Stage primaryStage) {
    TextArea area = new TextArea();
    area.setPrefRowCount(5);
    area.setPrefColumnCount(25);
    area.setTextFormatter(new TextFormatter<>(new ExpectedTextFilter("Hello, World!")));

    StackPane root = new StackPane(area);
    root.setPadding(new Insets(10));

    primaryStage.setScene(new Scene(root));
    primaryStage.show();
  }

  private static class ExpectedTextFilter implements UnaryOperator<Change> {

    private final String expectedText;

    ExpectedTextFilter(String expectedText) {
      this.expectedText = Objects.requireNonNull(expectedText);
    }

    @Override
    public Change apply(Change change) {
      if (change.isContentChange()) {
        if (change.isReplaced()) {
          // simply don't allow replacements
          return null;
        } else if (change.isDeleted()) {
          // only allow deletions from the end of the control's text
          return change.getRangeEnd() == change.getControlText().length() ? change : null;
        } else {
          return expectedText.startsWith(change.getText(), change.getRangeStart()) ? change : null;
        }
      }
      return change;
    }
  }
}

上面使用的是这个构造函数 of TextFormatter,它接受UnaryOperator。这个操作符(称为“过滤器” )可以拦截对文本输入控件的更改,并允许更改原样、更改它或完全拒绝它:

过滤器本身是一个接受UnaryOperator对象的TextFormatter.Change。它应该返回一个包含实际(过滤的)更改的TextFormatter.Change对象。返回null的拒绝添加的更改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59348922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档