Я пытаюсь перетащить пользовательский Node
(на самом деле Shape
, называемый Box
) из одного Pane
в другой.Когда я начинаю перетаскивание начального Pane
(откуда можно перетащить Box
), я устанавливаю dragView
в качестве снимка Box
.Но мой второй Pane
состоит из нескольких Box
, которые не должны сталкиваться друг с другом.Поэтому всякий раз, когда обнаруживается столкновение юнитов, я хочу, чтобы WriteableImage
из dragView
был изменен (указывая, что он не может быть там размещен).
В соответствии с документацией, в которой говорится:
public void setDragView (Image image)
Устанавливает визуальное представление данных, передаваемых в жесте перетаскивания.Этот метод следует вызывать только при запуске операции перетаскивания в обработчике DRAG_DETECTED, вызов его в другое время не имеет никакого эффекта.
Так нет ли возможности выполнить то, что я хочу?Что еще я мог бы сделать, чтобы имитировать его хотя бы?
Вот мои MouseListener
s:
boxStackPane
- это первый Pane
, источник Box
.mapPane
является целью Pane
, где необходимо проверить столкновение юнитов.Как я могу изменить изображение, установленное в setOnDragDetected
событии boxStackPane
?
this.boxStackPane.setOnDragDetected(e -> {
SnapshotParameters snapshotParameters = new SnapshotParameters();
snapshotParameters.setFill(Color.TRANSPARENT);
Dragboard dragboard = this.boxStackPane.startDragAndDrop(TransferMode.MOVE);
dragboard.setDragView(new Box().getNode().snapshot(snapshotParameters, null));
ClipboardContent clipboardContent = new ClipboardContent();
clipboardContent.put(this.dataFormatDragBox, "");
dragboard.setContent(clipboardContent);
e.consume();
});
this.mapPane.setOnDragOver(e -> {
Dragboard dragboard = e.getDragboard();
if (dragboard.hasContent(this.dataFormatDragBox)) {
e.acceptTransferModes(TransferMode.MOVE);
}
e.consume();
});
this.mapPane.setOnDragDropped(e -> {
Dragboard dragboard = e.getDragboard();
if (dragboard.hasContent(this.dataFormatDragBox)) {
this.layerContainer.addBox(new Box(), 0, 0);
}
e.consume();
});