JavaFX学习之样例3

JavaFX学习之样例3该代码主要是针对 node 的 mouseTranspa 和 pickOnBounds 属性 mouseTranspa 为 true 则该节点及其子节点的鼠标事件无效 也就是说对鼠标透明了 pickOnBounds 则是计算边界 也就是哪些地方鼠标点击会有效 默认为 false 则边界是几何的边界

大家好,我是讯享网,很高兴认识大家。

该代码主要是针对node的mouseTransparentProperty和pickOnBoundsProperty属性。
mouseTransparentProperty为true则该节点及其子节点的鼠标事件无效,也就是说对鼠标透明了。
pickOnBoundsProperty则是计算边界(也就是哪些地方鼠标点击会有效)。默认为false,则边界是几何的边界。为true则是用矩形刚好把几何框起来的边界。
看例子


import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ToggleButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

// Demonstrates the JavaFX node mouseTransparent and pickOnBounds properties.
public class LayerClick extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) throws Exception {
ToggleButton testButton = new ToggleButton(“”);

VBox layer1 = new VBox();
layer1.getChildren().add(testButton);

Node layer2 = new Circle(100, 100, 100, Color.FIREBRICK);
layer2.setOnMouseClicked(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
System.out.println(“circle click”);

}
});
layer2.setOpacity(0.7);

StackPane stack = new StackPane();
stack.getChildren().setAll(layer1, layer2);
stack.setStyle(“-fx-background-color: azure;”);

VBox layout = new VBox();
layout.getChildren().setAll(
stack,
createControls(testButton, layer2)
);

stage.setScene(new Scene(layout));
stage.show();
}

private VBox createControls(ToggleButton controlledButton, Node controlledNode) {
controlledButton.textProperty().bind(
Bindings
.when(controlledNode.mouseTransparentProperty()).then(“Completely Clickable”)
.otherwise(Bindings
.when(controlledNode.pickOnBoundsProperty()).then(“Not Clickable”)
.otherwise(“Partially clickable”)
)
); //button的text值绑定圆的mouseTransparentProperty和pickOnBoundsProperty

CheckBox enableMouseTransparency = new CheckBox(“Enable MouseTransparency”);
enableMouseTransparency.setSelected(controlledNode.isMouseTransparent());
controlledNode.mouseTransparentProperty().bind(enableMouseTransparency.selectedProperty());
//圆的mouseTransparentProperty绑定checkbox的选中属性。 mouseTransparentProperty若为true则该节点及其子节点的鼠标事件无效

CheckBox enablePickOnBounds = new CheckBox(“Enable Pick On Bounds”);
enablePickOnBounds.setSelected(controlledNode.isPickOnBounds());
controlledNode.pickOnBoundsProperty().bind(enablePickOnBounds.selectedProperty());
//圆的pickOnBoundsProperty绑定checkbox的选中属性
VBox controls = new VBox(10);
controls.setStyle(“-fx-background-color: cornsilk; -fx-padding: 10;”);
controls.getChildren().addAll(
enableMouseTransparency,
enablePickOnBounds
);

return controls;
}
}

讯享网
当二个属性都没选时,button只有一部分能按动,因为使用的stackpane存放的button和circle,circle在上面,盖住了button的一部分。

当mouseTransparentProperty为true时,此时circle对鼠标透明,所以此时button全都可以按动。

当pickOnBoundsProperty为true时,此时circle鼠标事件响应的边界,变成一个矩形(刚好框住圆形)。而button在矩形范围内,所以此时button完全被circle盖住了,不能点击。


讯享网

小讯
上一篇 2025-02-23 18:33
下一篇 2025-03-08 09:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/69301.html