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

时间:2017-07-25 12:26:57

标签: javafx input cursor textfield caret

我有一个TextField,我会在做出任何更改后进行检查。我也修剪掉任何打字的双倍空格。问题是,在用修剪后的文本替换文本后,Caret位置会刷新。我添加了计算,因此Caret将用于定位用户的最后输入,但它无法正常使用额外的空格。我的代码:

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

在图片中,用户将光标放在单词&#39; Friend&#39; 之前,按空格键,额外的空格将被修剪,在{em>&#39之后放置Caret ; F&#39; 。如果空格键保持更长时间,Caret将被放置在最后。

enter image description here

期望的结果:在&#39; Friend&#39; 之前放置插入符号。

这样做会更好吗?

2 个答案:

答案 0 :(得分:0)

插入位置未按预期工作的原因是,当字符串中有多个空格时,您没有减少插入位置。您应该删除多个空格的数量来删除插入位置。

在下面的代码中,我检查字符串是否至少有两个空格,如果是,那么我删除空格,并通过从字符串中删除的空格数减少插入位置。

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

我提供此解决方案取决于我对您提供的问题的理解。如果您需要任何进一步的帮助,请告诉我。

答案 1 :(得分:0)

caretPositionProperty和添加侦听器怎么样?

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