所以我理解你想拖放TextAreas
不同FlowPanes
。您可以通過使用DragEvents
而不是MouseEvents
來實現此目的。這裏有一個例子:
考慮一個簡單的佈局像你這樣的,只取TextArea
和兩個FlowPanes
考慮,我們就會有以下字段:
@FXML
private TextArea textArea;
@FXML
private FlowPane flowPane1;
@FXML
private FlowPane flowPane2;
一開始,textArea
位於flowPane1
,在GridLayout
的左側。
我們想拖放'textArea'向右flowPane
。所以首先,我們必須告訴textArea
它應該是可拖動的。在這種情況下,移動。你可以用不同的方式實現它,但是在這裏我會告訴你只需將現有TextArea
移動到另一個FlowPane
。另一種方法是重新創建一個文本。
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();
});
然後,我們希望flowPane2
接受textArea
當它被拖到。所以首先,我們告訴它在被拖動時接受textArea。
flowPane2.addEventHandler(DragEvent.DRAG_OVER, (DragEvent event) -> {
if (event.getGestureSource() != flowPane2
&& event.getDragboard().hasString()) {
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
}
event.consume();
});
在我們允許它被拖拽之後,我們確實希望它實際上做了某些事情並在丟棄時接受它。所以我們添加另一個處理程序來接受掉落的textArea
。
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();
});
的結果,textArea
可以移動從flowPane1
到flowPane2
。反之亦然,但這會讓你走!
我想我對此有更清楚的瞭解你的閱讀響應後,所以謝謝!你能解釋方法/ eventHandlers需要位於何處嗎? – wellington
這可能取決於你在哪裏創建它們。由於您通過按鈕創建了textArea,因此您可以在此處連接eventHandler。在這個例子中,我剛剛使用'initialize(URL,ResourceBundle)',它由'Controller'中的'Initializable'繼承。所以它在初始化時連線。 – Jaims