Возможно ли получить положение каретки (int
) при координате экрана (2 double
) в JavaFX TextArea
?JavaFX TextArea получить позицию каретки от координаты
ответ
Вы можете использовать метод getInsertionPoint в TextAreaSkin в обработчике перетаскивания:
TextAreaSkin skin = (TextAreaSkin) target.getSkin();
int insertionPoint = skin.getInsertionPoint(event.getX(), event.getY());
target.positionCaret(insertionPoint);
Однако класс кожи в com.sun.javafx *, так и с Java 9 выходите вы, вероятно. тогда придется делать что-то по-другому. Никто не знает, что они сломают или что они предоставляют в качестве замены. Однако с Java 8 он работает (пока).
Полный пример, в котором вы можете перетащить текст метки в любом положении в TextArea:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import com.sun.javafx.scene.control.skin.TextAreaSkin;
// Parts of this drag/drop example are from https://docs.oracle.com/javafx/2/drag_drop/HelloDragAndDrop.java.html
public class TextAreaDemo extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) {
Label source = new Label("Draggable Text");
TextArea target = new TextArea();
target.setPrefRowCount(10);
target.setPrefColumnCount(100);
target.setWrapText(true);
target.setPrefWidth(150);
String cssDefault = "Lorem ipsum dolor sit amet, et bonorum pertinacia est, verear temporibus definitionem nam an, ius cu justo legimus philosophia. Adversarium complectitur at sit, his ex sumo nibh consequuntur. Et vim adhuc mnesarchum, eum in ignota integre tincidunt. Erant oblique alterum no eos.";
target.setText(cssDefault);
HBox root = new HBox();
root.setSpacing(10);
HBox.setMargin(source, new Insets(10,10,10,10));
HBox.setMargin(target, new Insets(10,10,10,10));
root.getChildren().addAll(source, target);
Scene scene = new Scene(root, 600, 330, Color.WHITE);
primaryStage.setScene(scene);
primaryStage.show();
source.setOnDragDetected(new EventHandler <MouseEvent>() {
public void handle(MouseEvent event) {
/* allow any transfer mode */
Dragboard db = source.startDragAndDrop(TransferMode.ANY);
/* put a string on dragboard */
ClipboardContent content = new ClipboardContent();
content.putString(source.getText());
db.setContent(content);
event.consume();
}
});
target.setOnDragOver(new EventHandler <DragEvent>() {
public void handle(DragEvent event) {
/* accept it only if it is not dragged from the same node
* and if it has a string data */
if (event.getGestureSource() != target &&
event.getDragboard().hasString()) {
/* allow for both copying and moving, whatever user chooses */
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
// position caret at drag coordinates
TextAreaSkin skin = (TextAreaSkin) target.getSkin();
int insertionPoint = skin.getInsertionPoint(event.getX(), event.getY());
target.positionCaret(insertionPoint);
}
event.consume();
}
});
target.setOnDragDropped(new EventHandler <DragEvent>() {
public void handle(DragEvent event) {
/* if there is a string data on dragboard, read it and use it */
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasString()) {
target.insertText(target.getCaretPosition(), db.getString());
success = true;
}
/* let the source know whether the string was successfully
* transferred and used */
event.setDropCompleted(success);
event.consume();
}
});
}
}
import com.sun.javafx.scene.control.skin.TextAreaSkin;
import com.sun.javafx.scene.text.HitInfo;
/****************************************************/
TextAreaSkin skin = (TextAreaSkin) target.getSkin();
HitInfo mouseHit = skin.getIndex(e.getX(), e.getY());
// Now you can position caret
skin.positionCaret(mouseHit, false, false);
// And/or get insertion index
int insertionPoint = mouseHit.getInsertionIndex();
Для TextArea
этот метод эквивалентен ответу Роланда. Практическое отличие этого метода является его применимость к TextField
(другой подкласс TextInputControl
):
TextFieldSkin skin = (TextFieldSkin) target.getSkin();
HitInfo mouseHit = skin.getIndex(e.getX(), e.getY());
skin.positionCaret(mouseHit, false);
int insertionPoint = mouseHit.getInsertionIndex();
К сожалению, TextFieldSkin
не отменяет getInsertionPoint(...)
и реализация родителя возвращает 0, поэтому альтернативное решение здесь не работает.
Что касается Java 9, то и Roland, и мои ответы будут по-прежнему работать. Пакеты com.sun.javafx.scene.control.skin
и com.sun.javafx.scene.text
(где находится класс HitInfo
) перемещаются в общедоступный API на Java 9. Их местоположения будут javafx.scene.control.skin
и javafx.scene.text
соответственно. См Javadocs для JavaFX 9 здесь: http://download.java.net/java/jdk9/jfxdocs/index.html
Чтобы всегда видеть курсор, поставить это в setOnDragOver
-Methode
target.requestFocus();
это не отвечает на вопрос –
- 1. Получить позицию каретки в textarea (IE)
- 2. Textarea X/Y координаты каретки - плагин jQuery
- 3. Найти позицию каретки в textarea в пикселях
- 4. Python: Получить позицию каретки
- 5. Получить точную позицию каретки
- 6. Tinymce - Можно ли получить позицию каретки textarea, соответствующую редактору WYSIWYG?
- 7. TinyMCE 4 - получить позицию каретки
- 8. Как узнать координаты каретки (не позиция) в JavaFX?
- 9. JavaFX ListView: получить позицию строки
- 10. JavaFX - получить текущее слово, набираемое в TextArea
- 11. Eclipse: Получить и установить позицию каретки редактора
- 12. Координаты координат диаграммы JavaFX
- 13. Позиция Caret относительно координаты экрана в javaFX
- 14. JavaFX: Получить высоту строки TextArea
- 15. Получить позицию каретки в приложениях, отличных от GDI
- 16. Координаты мыши JavaFX
- 17. Сделать TextField/TextArea каретки видимыми в JavaFX GUI
- 18. Получить позицию каретки в HTML-вводе?
- 19. Получить позицию каретки в событии RichTextBox_Click
- 20. Получить позицию каретки (номер строки) в draft.js
- 21. Как получить позицию каретки для contentEditable div?
- 22. Получить позицию каретки в редактируемом div IE8
- 23. Получить положение XY каретки в TextArea
- 24. Как перемещать позицию каретки
- 25. Как получить текущую позицию каретки в текстовом поле SCEditor?
- 26. Позиция каретки в textarea и окружающих персонажах
- 27. Получить позицию от всех divs
- 28. Добавление возврата каретки в textarea
- 29. xy координаты каретки в iframe
- 30. JavaFX TextArea и autoscroll
Не могли бы вы описать, что вы пытаетесь достичь? Я думаю, вы знаете, что TextArea наследует caretPosition() от TextInputControl. Вот почему я спрашиваю. – VinceOPS
@VincentG Да, я знаю о функции 'caretPosition()', которая возвращает текущую позицию каретки. Я пытаюсь реализовать drag-and-drop, так что элементы в TreeView' можно перетащить в любое место текста. –