如何控制修剪后的 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);
});
我有一个 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);
});