gpt4 book ai didi

java - 如何在取消焦点之前获取 TextField 的最后一个插入符位置?

转载 作者:行者123 更新时间:2023-12-01 19:26:56 25 4
gpt4 key购买 nike

我尝试制作一个可以在 TextField 中插入特殊字符的按钮,这是我最初的实现:

// input is a TextField
input.insertText(input.getCaretPosition(), "∞");

但是我发现它总是将文本插入到开头,然后经过一些尝试,我发现“不聚焦”TextField 会使 caretPosition 变为 0。而这不是我想要的想要,所以我尝试使用直接监听 caretPosition 属性,如下所示:

AtomicInteger caretPos = new AtomicInteger();
input.caretPositionProperty().addListener((obs, oldVal, newVal) -> {
caretPos.set(newVal.intValue());
System.out.println(newVal.intValue());
});

但问题是失去焦点时仍然会调用listen,这会再次将caretPos重置为0。

最佳答案

如果文本字段失去焦点,只需避免更新 caretPos:

AtomicInteger caretPos = new AtomicInteger();
input.caretPositionProperty().addListener((obs, oldVal, newVal) -> {
if (input.isFocused()) {
caretPos.set(newVal.intValue());
System.out.println(newVal.intValue());
}
});

这是一个完整的工作示例:

import java.util.concurrent.atomic.AtomicInteger;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TextFieldFocusTest extends Application {

@Override
public void start(Stage primaryStage) throws Exception {

TextField input = new TextField();
Button insertInfinity = new Button("∞");


AtomicInteger caretPos = new AtomicInteger();
input.caretPositionProperty().addListener((obs, oldVal, newVal) -> {
if (input.isFocused()) {
caretPos.set(newVal.intValue());
}
});

insertInfinity.setOnAction(e -> {
int pos = caretPos.get();
input.insertText(pos, "∞");
input.requestFocus();
input.positionCaret(pos+1);
});

VBox root = new VBox(10);
root.setPadding(new Insets(10,10,10,10));
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(input, insertInfinity);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setWidth(400);
primaryStage.setHeight(400);
primaryStage.show();
}

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

}

关于java - 如何在取消焦点之前获取 TextField 的最后一个插入符位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61254473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com