更改 TextField 中插入符号的大小 (JavaFX 8)

Change the size of the caret in a TextField (JavaFX 8)

我试图在不修改字体大小的情况下调整 TextField 中插入符的大小,但我做不到。

有人知道怎么做吗?

谢谢!

我不知道你为什么要这样做。这可能不会给你你想要的,但它确实改变了插入符号的大小。请注意,大插入符号仍将被裁剪到包含 TextField 的范围内。

m 和 a 之间的细线是小插入符号。图像传输到 Whosebug 降低了清晰度,因此很难看到:

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

public class BiglyCaret extends Application {

    @Override 
    public void start(Stage stage) throws Exception {
        TextField bigCaretTextField = new TextField("Big Caret");
        bigCaretTextField.setSkin(
                new TextFieldCaretControlSkin(
                        bigCaretTextField,
                        2
                )
        );

        TextField smallCaretTextField = new TextField("Small Caret");
        smallCaretTextField.setSkin(
                new TextFieldCaretControlSkin(
                        smallCaretTextField,
                        0.5
                )
        );

        TextField normalTextField = new TextField("Standard Caret");

        VBox layout = new VBox(
                10,
                bigCaretTextField,
                smallCaretTextField,
                normalTextField
        );

        layout.setPadding(new Insets(10));
        stage.setScene(new Scene(layout));

        stage.show();
    }

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

TextFieldCaretControlSkin.java

注意,这在 Java 8 中使用私有 API class,因此它不适用于 Java 9。在 Java 9 中,TextFieldSkin 将变为 public API(移动到 javafx 包而不是 com.sun 包),因此它可能会在 Java 9 中工作,如果你换包。

import com.sun.javafx.scene.control.skin.TextFieldSkin;
import javafx.scene.control.TextField;

public class TextFieldCaretControlSkin extends TextFieldSkin {
    public TextFieldCaretControlSkin(TextField textField, double scale) {
        super(textField);

        setScale(scale);
    }

    private void setScale(double scale) {
        caretPath.setScaleX(scale);
        caretPath.setScaleY(scale);
    }
}

此答案基于此答案:

  • Hide input caret of TextField in JavaFX8