【问题标题】:JavaFX Drag View for Transparent png image用于透明 png 图像的 JavaFX 拖动视图
【发布时间】:2016-05-25 15:02:48
【问题描述】:

我正在尝试将表示为具有透明背景的 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));

但它不起作用,白色背景仍然存在。 有没有其他方法可以让它像原图一样透明?

【问题讨论】:

    标签: javafx drag-and-drop


    【解决方案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,如果它仍然存在,则可能更容易调查您的问题。

    【讨论】:

    • 我将 'db.setDragView' 更改为 'content.putImage' 并且拖动图像再次透明。我不知道有什么区别,但效果很好。
    【解决方案2】:

    您必须将快照参数更改为透明填充:

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 2018-10-09
      • 2011-05-31
      • 2016-09-29
      • 2012-03-23
      • 2021-10-13
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多