2016-05-15 16 views
0

Ich benutze FXML neben Scene Builder, um eine sehr einfache Schnittstelle zu entwickeln. Im Folgenden repräsentiert das erste Bild die Layout-Hierarchie. Das zweite Bild zeigt einen Textbereich an, wenn die Taste gedrückt wird.JavaFX Scene Builder - Drag-and-Drop zwischen Elternknoten

Die Aktionsereignismethode instanziiert einen neuen Textbereich und weist ihn dem ersten Fensterbereich zu (von links nach rechts). Mein Ziel ist es, jeden Textbereich in einen der anderen Flow-Bereiche zu ziehen.

Mein erster Versuch war assign Verwendung einen Event-Handler verwenden MOUSE_PRESSED zu erkennen: textArea.addEventHandler(MouseEvent.DRAG_DETECTED, e-> handle(e));

Als ich bekam den Griff Methode einrichten, die Dinge bekam verwirrend. Zum Beispiel, sollte ich die anderen verschiedenen MouseEvents wie MOUSE_EXITED_TARGET, MOUSE_ENTERED_TARGET? Und wie ist der MOUSE_RELEASED-Griff zusammengesetzt?

Ich fing an, Dragboard und Zwischenablage zu sehen, und fand auch nicht viel Glück dort. Die Zwischenablage schien nur in der Lage zu sein, Zeichenkettenwerte zu verarbeiten, oder auf eine Art von Art und Weise, Bilder. Ich bin mir sicher, dass es eine einfache Antwort auf meine missliche Lage gibt, da es deutlich zeigt, dass ich mich auf unbekanntes Terrain bewege.

Ich habe mehrere "Lehrbuch" -Ressourcen durchgelesen, aber alle behandeln die Bewegung von Objekten, die zur Laufzeit erstellt werden, und die meisten entsprechen scheinbar generischen oder einfachen Beispielen.

HINWEIS Ich entschuldige mich für die Bilder, ich weiß, es ist nicht ganz klar. Es gibt 5 Flussbereiche, die über den Rasterbereich verteilt sind. Ich werde versuchen, es in Kürze zu bearbeiten und zu aktualisieren.

initial interface hierarchy after button is pressed

Antwort

1

So verstehe ich Sie versuchen TextAreas zu verschiedenen FlowPanes zu ziehen. Sie können dies erreichen, indem Sie DragEvents, nicht MouseEvents verwenden. Hier ein Beispiel:

ein einfaches Layout wie das Ihre Betrachtet man nur unter der TextArea und zwei FlowPanes berücksichtigt, würden wir die folgenden Felder haben:

@FXML 
private TextArea textArea; 

@FXML 
private FlowPane flowPane1; 

@FXML 
private FlowPane flowPane2; 

Zu Beginn textArea positioniert ist, auf flowPane1, auf der linken Seite der GridLayout.

TextArea on left grid

Wir möchten'textArea' per Drag & Drop nach rechts flowPane. Zuerst müssen wir dem textArea mitteilen, dass es ziehbar sein sollte. In diesem Fall bewegt. Sie können es auf verschiedene Arten implementieren, aber hier zeige ich Ihnen, dass Sie einfach die vorhandene TextArea auf die andere FlowPane verschieben. Eine andere Methode wäre, nur eines mit dem Text neu zu erstellen.

textArea.setOnDragDetected((MouseEvent event) -> { 
    //We want the textArea to be dragged. Could also be copied. 
    Dragboard db = textArea.startDragAndDrop(TransferMode.MOVE); 

    // Put a string on a dragboard as an identifier 
    ClipboardContent content = new ClipboardContent(); 
    content.putString(textArea.getId()); 
    db.setContent(content); 

    //Consume the event 
    event.consume(); 
}); 

Dann würden wir gerne die flowPane2textArea zu akzeptieren, wenn es um die Länge gezogen wird. Als erstes sagen wir ihm, dass er den textArea akzeptieren soll, wenn er übergezogen wird.

Nachdem wir es erlaubt haben, es zu ziehen, wollen wir, dass es tatsächlich etwas tut und es akzeptiert, wenn es fallen gelassen wird.Also fügen wir einen weiteren Handler hinzu, um die gelöschten textArea zu akzeptieren.

flowPane2.addEventHandler(DragEvent.DRAG_DROPPED, (DragEvent event) -> { 
    //Get the dragboard back 
    Dragboard db = event.getDragboard(); 
    boolean success = false; 
    //Could have some more thorough checks of course. 
    if (db.hasString()) { 
     //Get the textarea and place it into flowPane2 instead 
     flowPane2.getChildren().add(textArea); 
     success = true; 
    } 
    //Complete and consume the event. 
    event.setDropCompleted(success); 
    event.consume(); 
}); 

Das Ergebnis kann die textAreaflowPane1-flowPane2 bewegt werden. Nicht umgekehrt, aber das wird dich in Schwung bringen!

Dragged textArea

+0

Ich glaube, ich habe ein viel klareres Verständnis für diese nach Ihrer Antwort zu lesen, so es Ihnen danken! Können Sie erklären, wo sich die Methode/eventHandler befinden müssen? – wellington

+0

Das hängt wahrscheinlich davon ab, wo Sie sie erstellen. Da Sie Ihren textArea über eine Schaltfläche erstellen, könnten Sie wahrscheinlich den eventHandler direkt dort anschließen. In diesem Beispiel habe ich nur 'initialize (URL, ResourceBundle)' verwendet, das von 'Initializable' im' Controller' geerbt wird. Es ist also verdrahtet, wenn es initialisiert ist. – Jaims

Verwandte Themen