我有一个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
将被放置在最后。
期望的结果:在&#39; Friend&#39; 之前放置插入符号。
这样做会更好吗?
答案 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);
});