我有这样的场景:
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
节点上向右拖动的情况。如果鼠标拖过label
或image
...它不会悬停。
你能帮我吗?
答案 0 :(得分:1)
我真的不明白你是如何自己触发悬停效果的,但我认为你不应该这样做。它可以由setOnDragEntered
和setOnDragExited
事件处理程序自动处理,您只需指定预期的行为即可。我举了一个小例子来介绍它们是如何工作的。
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徽标)上,则无关紧要。