2015-06-11 13 views
5

JavaFX TextArea'da bir ekran koordinatında (2 double) düzeltme işaretini (int) almak mümkün mü?JavaFX TextArea ayar listesinden koordinat konumunu al

+0

bu koydu? TextArea'nın TextInputControl'den caretPosition() öğesini aldığını biliyorsunuzdur. Bu yüzden soruyorum. – VinceOPS

+0

@VincentG Evet Geçerli caret konumunu döndüren caretPosition() işlevinin farkındayım. Bir 'TreeView' içindeki öğelerin metnin herhangi bir yerine sürüklenebilmesi için bir sürükle ve bırak uygulaması yapmaya çalışıyorum. –

cevap

7

Sen sürükleme işleyicisinde TextAreaSkin arasında getInsertionPoint yöntemi kullanabilirsiniz:

TextAreaSkin skin = (TextAreaSkin) target.getSkin(); 
int insertionPoint = skin.getInsertionPoint(event.getX(), event.getY()); 
target.positionCaret(insertionPoint); 

Ancak cilt sınıf com.sun.javafx içindedir *, Java 9 ile çok muhtemelen edeceğiz dışarı çıkıyor. o zaman farklı şeyler yapmak zorunda. Kimse ne kıracaklarını ya da değiştirdikleri şeyin ne olduğunu bilmiyor. Ancak, Java 8 ile (şimdilik) çalışır. Eğer TextArea herhangi pozisyona bir Etiketinin metni sürükleyebilirsiniz hangi

için tam bir örnek:

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(); 
      } 
     }); 
    } 
} 
1
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 için bu yöntem Roland'ın cevap eşdeğerdir.

TextFieldSkin skin = (TextFieldSkin) target.getSkin(); 
HitInfo mouseHit = skin.getIndex(e.getX(), e.getY()); 
skin.positionCaret(mouseHit, false); 
int insertionPoint = mouseHit.getInsertionIndex(); 

Maalesef TextFieldSkingetInsertionPoint(...) ve ebeveynin Yerleştirme çok alternatif çözüm burada çalışmıyor 0 döndürür geçersiz kılmaz: Bu yöntemin pratik farkı TextField uygulanabilirlik (TextInputControl diğer bir alt kümesi) 'dir.

Java 9 ile ilgili olarak, hem Roland’ın hem de yanıtlarım çalışmaya devam edecektir. com.sun.javafx.scene.control.skin ve com.sun.javafx.scene.text (HitInfo sınıfının bulunduğu) paketler, Java 9'daki genel API'ye taşınır. Konumları sırasıyla javafx.scene.control.skin ve javafx.scene.text olacaktır. Burada JavaFX 9 için Javadocs bakınız: http://download.java.net/java/jdk9/jfxdocs/index.html

0

daima imleci görmek için, size ulaşmak için çalışıyoruz ne tarif edebilir misiniz setOnDragOver -Methode

target.requestFocus(); 
+0

bu soruya cevap vermiyor –