Как получить последнюю позицию каретки TextField перед расфокусировкой? - PullRequest
0 голосов
/ 16 апреля 2020

Я попытался создать кнопку, которая может вставлять специальный символ в 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());
});

Но проблема в том, что слушатель все равно будет вызываться при потере фокуса, который снова сбрасывает caretPos в 0.

1 Ответ

3 голосов
/ 16 апреля 2020

Просто избегайте обновления 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...