拖动时悬停

时间:2017-01-23 10:15:50

标签: javafx drag-and-drop hover

我有这样的场景:

FlowPane
   AnchorPane
      VBox
         Label
            LabeledText
         HBox
            ImageView
            VBox
               Label
                  LabeledView
         StackPane
            HBox
               ImageView

FlowPane有多个AnchorPane个节点。我需要的是让AnchorPane徘徊,同时将某些东西拖过它上面的任何东西。就像我没有拖动而只是移动鼠标一样。 我可以使用:

以编程方式触发hover
private static PseudoClass HOVER_PSEUDO_CLASS = PseudoClass.getPseudoClass("hover");
anchorePane.pseudoClassStateChanged(HOVER_PSEUDO_CLASS, true);

但这只适用于鼠标在AnchorPane节点上向右拖动的情况。如果鼠标拖过labelimage ...它不会悬停。 你能帮我吗?

1 个答案:

答案 0 :(得分:1)

我真的不明白你是如何自己触发悬停效果的,但我认为你不应该这样做。它可以由setOnDragEnteredsetOnDragExited事件处理程序自动处理,您只需指定预期的行为即可。我举了一个小例子来介绍它们是如何工作的。

public class JavaFXTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        BorderPane root = new BorderPane();

        ImageView avatar = new ImageView("https://www.gravatar.com/avatar/1eb4610d0e524773a8d28f8896dd5f20?s=64&d=identicon&r=PG");
        avatar.setOnDragDetected(e -> {
            Dragboard db = avatar.startDragAndDrop(TransferMode.ANY);
            ClipboardContent content = new ClipboardContent();
            content.putImage(avatar.getImage());
            db.setContent(content);
            e.consume();
        });
        root.setLeft(avatar);

        root.setCenter(getAnchorPane());
        root.setRight(getAnchorPane());

        Scene scene = new Scene(root, 400, 150);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public AnchorPane getAnchorPane() {
        AnchorPane pane = new AnchorPane();
        pane.setOnDragEntered(e -> {
            pane.setStyle("-fx-border-style: dotted;");
        });
        pane.setOnDragExited(e -> {
            pane.setStyle("");
        });
        AnchorPane.setTopAnchor(pane, 20d);
        AnchorPane.setLeftAnchor(pane, 100d);
        ImageView imageView = new ImageView("http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png");
        pane.getChildren().add(imageView);

        return pane;
    }

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

首先,我创建一个带有一个图像(我的gravatar)的舞台,可以拖动它,以及两个相同的面板 - 这实际上是start方法所做的一切。

getAnchorPane()方法创建面板并设置其事件处理程序:如果拖动任何内容,面板将其边框更改为点线。如果将鼠标悬停在面板上或其子节点(即stackoverflow徽标)上,则无关紧要。

Example