Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaFX中知道插入符号坐标(而不是位置)?_Java_Javafx_Caret - Fatal编程技术网

如何在JavaFX中知道插入符号坐标(而不是位置)?

如何在JavaFX中知道插入符号坐标(而不是位置)?,java,javafx,caret,Java,Javafx,Caret,我想在JavaFX控件中的插入符号附近画一个类似自动完成的下拉框,如和 是否可以知道节点坐标系中插入符号的双数字坐标?您可以使用inputMethodRequests属性检索位置。您可以指定相对于选择开始的索引,以获取字符的屏幕坐标 private static ContextMenu createMenu(String... text) { ContextMenu menu = new ContextMenu(); EventHandler<ActionEvent>

我想在JavaFX控件中的插入符号附近画一个类似自动完成的下拉框,如和


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

您可以使用
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();
}
private static ContextMenu createMenu(字符串…文本){
ContextMenu=新建ContextMenu();
EventHandler=evt->{
TextInputControl=(TextInputControl)菜单.getUserData();
字符串t=((MenuItem)evt.getSource()).getText();
对照选择(t);
};
for(字符串s:文本){
菜单项=新菜单项;
项目.设置动作(处理程序);
menu.getItems().add(项);
}
返回菜单;
}
@凌驾
公共无效开始(阶段primaryStage){
ContextMenu=createMenu(“你好,世界”,“42”,“foo”,“bar”);
TextArea TextArea=新建TextArea();
TextField TextField=新的TextField();
VBox root=新的VBox(textArea,textField);
根。设置填充(新插图(10));
EventHandler=evt->{
if(evt.isControlDown()&&evt.getCode()==KeyCode.SPACE){
evt.consume();
TextInputControl=(TextInputControl)evt.getSource();
Point2D pos=control.getInputMethodRequests().getTextLocation(0);
菜单。设置用户数据(控制);
显示菜单(控件,位置getX(),位置getY());
menu.requestFocus();
}
};
textArea.addEventFilter(按下KeyEvent.KEY,处理程序);
textField.addEventFilter(按下KeyEvent.KEY_,处理程序);
场景=新场景(根);
初级阶段。场景(场景);
primaryStage.show();
}

可以肯定的是,这不是您想要的吗?