我需要记住大约3页的文字逐字,包括标点符号。我试图建立一个简单的JavaFX程序来测试我自己的这些材料。
我想为用户输入一个文本区域。用户将键入文本区域--如果输入与现有字符串(我需要记住的内容)正确匹配,则允许将文本作为文本字段的输入。如果他们犯了错误,输入就不会被识别,文本区域也不会出现不正确的输入。
做这种事最好的方法是什么?总的来说,我对JavaFX和Java非常陌生。我已经在JavaFX中设置了UI,我只是不知道如何在文本区域实现检查。谢谢。
发布于 2019-12-16 06:35:07
一种选择是使用TextFormatter
,它只允许与预期文本相似的新文本。这里有一个概念的证明
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的拒绝添加的更改。
https://stackoverflow.com/questions/59348922
复制相似问题