【问题标题】:How to know caret coordinates (not position) in JavaFX?如何知道 JavaFX 中的插入符号坐标(不是位置)?
【发布时间】:2016-12-07 21:16:25
【问题描述】:

我想在 TextFieldTextArea 等 JavaFX 控件中的插入符号附近绘制类似自动完成的下拉框。

是否可以知道节点坐标系中插入符号的双数值坐标?

【问题讨论】:

标签: java javafx caret


【解决方案1】:

您可以使用inputMethodRequests 属性来检索位置。您可以指定相对于选择开始的索引来获取字符的屏幕坐标。

private static ContextMenu createMenu(String... text) {
    ContextMenu menu = new ContextMenu();
    EventHandler<ActionEvent> handler = evt -> {
        TextInputControl control = (TextInputControl) menu.getUserData();
        String t = ((MenuItem) evt.getSource()).getText();
        control.replaceSelection(t);
    };
    for (String s : text) {
        MenuItem item = new MenuItem(s);
        item.setOnAction(handler);
        menu.getItems().add(item);
    }
    return menu;
}

@Override
public void start(Stage primaryStage) {
    ContextMenu menu = createMenu("Hello World", "42", "foo", "bar");
    TextArea textArea = new TextArea();

    TextField textField = new TextField();

    VBox root = new VBox(textArea, textField);
    root.setPadding(new Insets(10));

    EventHandler<KeyEvent> handler = evt -> {
        if (evt.isControlDown() && evt.getCode() == KeyCode.SPACE) {
            evt.consume();
            TextInputControl control = (TextInputControl) evt.getSource();
            Point2D pos = control.getInputMethodRequests().getTextLocation(0);
            menu.setUserData(control);
            menu.show(control, pos.getX(), pos.getY());
            menu.requestFocus();
        }
    };

    textArea.addEventFilter(KeyEvent.KEY_PRESSED, handler);
    textField.addEventFilter(KeyEvent.KEY_PRESSED, handler);

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多