2016-12-07 13 views
1

私は、TextFieldTextAreaのようなJavaFXコントロールで、キャレットの近くにオートコンプリートのようなドロップダウンボックスを描きたいと思います。JavaFXのキャレット座標(位置ではない)を知るには?

ノード座標系でのキャレットの二重数値座標を知ることはできますか?

+2

これはあなたが探しているものではありません[Ambior answer](https://github.com/TomasMikula/RichTextFX/issues/30)? –

答えて

1

inputMethodRequestsプロパティを使用して位置を取得できます。選択範囲の先頭からの相対的なインデックスを指定して、charの画面座標を取得することができます。

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(); 
} 
関連する問題