JavaFX拖动视图以获取透明png图像

时间:2016-05-25 15:02:48

标签: javafx drag-and-drop

我正在尝试将一个Object,它表示为具有透明背景的PNG图像,从AnchorPane到HBox。

我使用以下行将图像设置为拖动视图:

        SliderItemHandler mh = (SliderItemHandler) event.getSource();
        Dragboard db = mh.startDragAndDrop(TransferMode.COPY);
        db.setDragView(mh.getModule().getImage());
        ClipboardContent content = new ClipboardContent();
        db.setContent(content);

对于不透明的背景图像,一切都很好,但是对于透明的图像,图像具有不透明度的白色背景" 0.8"我想。

我尝试为节点拍摄快照:

        db.setDragView(mh.snapshot(new SnapshotParameters(), null));

但它没有工作,白色背景仍在那里。 还有其他方法让它像原始图像一样透明吗?

2 个答案:

答案 0 :(得分:1)

我不确定如何获得白色背景,考虑到不透明度。但是,我重新创建了您的用例,并将向您展示我是如何实现它的。

以下图片是Scene,左侧为AnchorPane,右侧为HBox。作为要复制的源ImageView的小透明圆圈,其旁边的较大圆圈是放置的Image,而最右边的圆圈是当前被拖动的圆圈。 (屏幕截图不包含光标。)

Drag

正如您所看到的,在3种情况中,没有一种是白色(或几乎是白色)背景。它只是图像本身,拖动时图像本身更加透明。

为实现这一目标,我们将考虑2个变量。来源ImageView和目的地HBox

@FXML
private HBox destination;
@FXML
private ImageView image;

我们希望拖动图片,因此我们会在DRAG_DETECTED上添加ImageView个事件。

image.addEventHandler(MouseEvent.DRAG_DETECTED, mouseEvent -> {
    Dragboard db = image.startDragAndDrop(TransferMode.COPY);
    ClipboardContent content = new ClipboardContent();
    content.putImage(image.getImage());
    db.setContent(content);
    mouseEvent.consume();
});

然后我们希望目标HBox接受拖动的ImageView

destination.addEventHandler(DragEvent.DRAG_OVER, (DragEvent event) -> {
    if (event.getDragboard().hasImage()) {
        event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
    }
    event.consume();
});

当然,我们希望ImageView在实际投放时放入HBox。在这种情况下,它只是将其副本放入HBox,但是当然可以实现。

destination.addEventHandler(DragEvent.DRAG_DROPPED, (DragEvent event) -> {
    Dragboard db = event.getDragboard();
    destination.getChildren().add(new ImageView(db.getImage()));
    event.setDropCompleted(true);
    event.consume();
});

这就是拖放图像的全部内容。没有白色背景涉及透明图像。但是,如果您能够创建MCVE,则可能更容易查看问题,如果问题仍然存在。

答案 1 :(得分:0)

您必须将快照参数更改为transpartent fill:

SnapshotParameters sp = new SnapshotParameters();
sp.setFill(Color.TRANSPARENT);
db.setDragView(mh.snapshot(sp, null));

结果将是透明的,没有白色边框。