2017-01-18 2 views
1

Каков наилучший способ показать полупрозрачную «копию» узла рядом с иконкой мыши во время перетаскивания?Перетаскивание JavaFX с пользовательским узлом рядом с иконкой мыши

В основном у меня есть HBoxes с цветными фонами и текстовыми надписями в них, и я бы хотел показать, что они «приклеиваются» к курсору мыши, когда их таскают.

Хорошо, если пользователи могут визуально проверить, ЧТО они перетаскивают, вместо того, чтобы просто видеть, как курсор мыши изменяется на различные значки перетаскивания. Сцена-строитель имеет тенденцию делать это при перетаскивании некоторых компонентов, таких как RadioButton.

+2

Вы делаете «платформы при поддержке перетаскивания» (т.е. вы вызываете 'startDragAndDrop' на узле в какой-то момент)? Если это так, вы можете просто вызвать 'Dragboard.setDragView (...)', чтобы установить курсор изображения для перетаскивания. –

+0

Просто внутреннее, ничего вне окна приложения. – User

+0

Это не то, что я спросил. –

ответ

2

«Полупрозрачная» копия «узла» выполняется путем вызова snapshot(null, null) на узле, который возвращает WritableImage. Затем вы установите этот WritableImage как вид перетаскивания DragBoard. Вот небольшой пример того, как это сделать:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.input.ClipboardContent; 
import javafx.scene.input.DataFormat; 
import javafx.scene.input.Dragboard; 
import javafx.scene.input.TransferMode; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class DragAndDrop extends Application { 
    private static final DataFormat DRAGGABLE_HBOX_TYPE = new DataFormat("draggable-hbox"); 

    @Override 
    public void start(Stage stage) { 
     VBox content = new VBox(5); 

     for (int i = 0; i < 10; i++) { 
      Label label = new Label("Test drag"); 

      DraggableHBox box = new DraggableHBox(); 
      box.getChildren().add(label); 

      content.getChildren().add(box); 
     } 

     stage.setScene(new Scene(content)); 
     stage.show(); 
    } 

    class DraggableHBox extends HBox { 
     public DraggableHBox() { 
      this.setOnDragDetected(e -> { 
       Dragboard db = this.startDragAndDrop(TransferMode.MOVE); 

       // This is where the magic happens, you take a snapshot of the HBox. 
       db.setDragView(this.snapshot(null, null)); 

       // The DragView wont be displayed unless we set the content of the dragboard as well. 
       // Here you probably want to do more meaningful stuff than adding an empty String to the content. 
       ClipboardContent content = new ClipboardContent(); 
       content.put(DRAGGABLE_HBOX_TYPE, ""); 
       db.setContent(content); 

       e.consume(); 
      }); 
     } 
    } 

    public static void main(String[] args) { 
     launch(); 
    } 
} 
+0

Хех, не знал, что вы могли бы пройти (null, null) до моментального снимка, потому что я не достаточно RTFM ... ах, все равно это работает. – User

Смежные вопросы