我正在尝试将一个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));
但它没有工作,白色背景仍在那里。 还有其他方法让它像原始图像一样透明吗?
答案 0 :(得分:1)
我不确定如何获得白色背景,考虑到不透明度。但是,我重新创建了您的用例,并将向您展示我是如何实现它的。
以下图片是Scene
,左侧为AnchorPane
,右侧为HBox
。作为要复制的源ImageView
的小透明圆圈,其旁边的较大圆圈是放置的Image
,而最右边的圆圈是当前被拖动的圆圈。 (屏幕截图不包含光标。)
正如您所看到的,在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));
结果将是透明的,没有白色边框。