我在javafx中有一个TextArea,但是我需要获取坐标或位置(x,y)才能在TextArea中移动浮动菜单

时间:2018-07-14 23:13:45

标签: javafx javafx-8 javafx-2

我有一个问题,我找不到解决方法。我在互联网上进行搜索,但是没有找到任何信息可以告诉我如何使用JavaFX获取TextArea内插入符号的坐标或位置(x,y)。

1 个答案:

答案 0 :(得分:0)

TextInputControl具有属性caretPosition,该属性将位置表示为char-index-in-text。将文本坐标转换为(x,y)坐标的协作者是它的皮肤:TextInputControlSkin提供了一种转换方法getCharacterBounds(index)

所以在(x,y)坐标中跟踪插入符号位置的方法是

  1. 在文本坐标中收听控件的插入符位置
  2. 查询其皮肤以将文本坐标转换为2D坐标
  3. 使用这些元素来定位节点

下面的简单示例在插入符号周围显示了一个红色矩形。

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);
    }
}