我有一个问题,我找不到解决方法。我在互联网上进行搜索,但是没有找到任何信息可以告诉我如何使用JavaFX获取TextArea
内插入符号的坐标或位置(x,y)。
答案 0 :(得分:0)
TextInputControl具有属性caretPosition,该属性将位置表示为char-index-in-text。将文本坐标转换为(x,y)坐标的协作者是它的皮肤:TextInputControlSkin提供了一种转换方法getCharacterBounds(index)
。
所以在(x,y)坐标中跟踪插入符号位置的方法是
下面的简单示例在插入符号周围显示了一个红色矩形。
public class TextCaretPosition extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("TextArea Experiment 1");
TextArea textArea = new TextArea("This is all\nmy text\nin here.");
ObjectProperty<Rectangle> caretShape = new SimpleObjectProperty<>();
textArea.caretPositionProperty().addListener((src, ov, nv ) -> {
TextInputControlSkin<TextArea> skin = (TextInputControlSkin<TextArea>) textArea.getSkin();
if (skin != null) {
Rectangle2D bounds = skin.getCharacterBounds(nv.intValue());
caretShape.set(new Rectangle(bounds.getMinX(), bounds.getMinY(),
bounds.getWidth(), bounds.getHeight()));
}
});
caretShape.addListener((src, ov, r) -> {
Skin<?> skin = textArea.getSkin();
if (skin instanceof SkinBase) {
if (ov != null) {
((SkinBase<?>) skin).getChildren().remove(ov);
}
if (r != null) {
r.setStroke(Color.RED);
r.setFill(Color.TRANSPARENT);
r.setMouseTransparent(true);
((SkinBase<?>) skin).getChildren().add(r);
}
}
});
VBox vbox = new VBox(textArea);
Scene scene = new Scene(vbox, 200, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}