代码之家  ›  专栏  ›  技术社区  ›  Alyona

如何控制修剪文本字段中插入符号的位置?

  •  0
  • Alyona  · 技术社区  · 7 年前

    我有一个 TextField 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);
    

    '朋友' ,按下空格键,多余的空间将被修剪,放置 插入符号 “F” 插入符号

    enter image description here

    '朋友' .

    这样做更好吗?

    2 回复  |  直到 3 年前
        1
  •  1
  •   lambad    7 年前

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

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

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

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

        2
  •  0
  •   Rafael Gimenes    6 年前

    caretPositionProperty和add listener怎么样??

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