如何控制修剪后的 TextField 中的插入符位置?

How to control Caret position in trimmed TextField?

我有一个 TextField,我会在其中进行任何更改后进行检查。我还 trim 删除了所有输入的双 space。问题是,在我用 trimmed one 替换文本后,Caret 位置会刷新。我添加了计算,因此 Caret 将转到用户最后输入的位置,但它无法正常使用额外的 spaces。我的代码:

EventHandler<InputEvent> fieldChangeListener = new EventHandler<InputEvent>() {
            public void handle(InputEvent event) {
                TextField field = (TextField) event.getSource();

                int caretPos = field.getCaretPosition();

                String text = field.getText();
                text = text.replaceAll("\s+", " ").trim();
                field.setText(text);
                field.positionCaret(caretPos);

                event.consume();}};

name.addEventHandler(KeyEvent.KEY_RELEASED, fieldChangeListener);

在图片中,用户将光标放在单词 'Friend' 之前,按下 space 栏,额外的 space 将获得 trimmed , 将 Caret 紧跟在 'F' 之后。如果 space 柱将保持更长的时间,则 Caret 将放置在最后。

期望的结果: 插入符放在单词 'Friend' 之前。

怎么做会更好?

插入符号位置未按预期工作的原因是当字符串中有多个 space 时您没有减少插入符号位置。您应该删除插入符号位置删除多个 spaces.

在下面的代码中,我检查字符串是否至少有双倍的 spaces,如果有,那么我删除 spaces 并将插入符号位置减少 spaces 从字符串中删除。

 import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.InputEvent;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Miner extends Application {


    @Override
    public void start(Stage primaryStage) throws Exception {
        AnchorPane pane  = new AnchorPane();
        TextField tf = new TextField("HELLO FRIEND");
        int CaretPos = tf.getCaretPosition();
        System.out.println("CaretPos = " + CaretPos);
        pane.getChildren().add(tf);

        EventHandler<InputEvent> fieldChangeListener = new EventHandler<InputEvent>() {
            public String AtLeastDoubleSpace = "  ";

            public void handle(InputEvent event) {
                TextField field = (TextField) event.getSource();
                String text = field.getText();
                String originalString = text;
                int caretPos;
                if(text.contains(AtLeastDoubleSpace)) {
                    caretPos = field.getCaretPosition();
                    text = text.replaceAll("\s+"," ").trim();
                    field.setText(text);
                    int spacesRemoved = originalString.length() - text.length();
                    field.positionCaret(caretPos - spacesRemoved);
                    event.consume();
                } else {
                    caretPos = field.getCaretPosition();
                    field.setText(text);
                    field.positionCaret(caretPos);
                    event.consume();
                }

            }};

        tf.addEventHandler(KeyEvent.KEY_RELEASED, fieldChangeListener);

        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();

    }



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

我根据我对你提供的问题的理解提供了这个解决方案。如果您需要任何进一步的帮助,请告诉我。

caretPositionProperty 和添加侦听器如何?

textField.caretPositionProperty().addListener((ob, old1, new1) -> {
System.out.println("old:" + old1 + "  new " + new1);
});