微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何防止窗格交叉阻塞另一个窗格? javafx

如何解决如何防止窗格交叉阻塞另一个窗格? javafx

因此,在示例代码中,我有两个窗格(现在是 A 和 B),其中 A 窗格位于 B 上方,我的问题是,如果 A 窗格的边界与 B 窗格的边界相交,则 A 窗格正在阻止 B 窗格阻止我进行交互有了孩子,我希望我的示例代码可以更好地解释我想要的东西。

所以我想要实现的是能够与 Rectangle globalPaneR 与窗格的当前边界进行交互。

package stackoverflow;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class StcakOverFlow extends Application
{
    public static final Pane uiPane = new Pane();
    public static final Pane global_pane = new Pane();
    private Pane localPane = new Pane(global_pane,uiPane);

    @Override
    public void init()
    {
        Rectangle leftTopR = new Rectangle(25,25,50,50);
        Rectangle rightBottomr = new Rectangle(700,700,50);
        Rectangle globalPaneR = new Rectangle(600,600,50);
        leftTopR.setFill(Color.RED);
        rightBottomr.setFill(Color.YELLOW);
        globalPaneR.setFill(Color.BLUE);

        globalPaneR.setonMouseClicked(e -> globalPaneR.setFill(Color.LIME));

        uiPane.getChildren().addAll(leftTopR,rightBottomr);
        global_pane.getChildren().add(globalPaneR);
    }

    @Override
    public void start(Stage stage)
    {
        Scene scene = new Scene(localPane);
        stage.setScene(scene);
        stage.setTitle("StackOverFlow");
        stage.show();
    }

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

解决方法

正如您已经注意到的,uiPane 位于 global_pane 的顶部,因此消耗了所有应到达 globalPaneR 矩形的鼠标事件。在本例中,这可以通过多种方式克服:

选项 1(最通用):将“阻止”窗格的 pickOnBounds 属性值设置为 false

uiPane.setPickOnBounds(false);

文档说明了 pickOnBoundsProperty

定义在由 MouseEvent 或 contains 函数调用触发时如何为此节点完成拾取计算。如果pickOnBounds 为真,则通过与此节点的边界相交来计算拾取,否则通过与此节点的几何形状相交来计算拾取。除非被子类覆盖,否则此属性的默认值为 false。 Region 的默认值为 true。

因此,在这种情况下,这基本上意味着 uiPane 不应消耗鼠标事件,除非鼠标悬停在其子项(矩形)上。

选项 2:对包含矩形的节点使用 Group 而不是 Pane

public static final Group uiPane = new Group();

这是有效的,因为 Group 不继承自 Region(如 Pane 那样),因此 pickOnBounds 属性已经具有默认值 false

选项 3:更改窗格的顺序。

显然这并不总是可行的,因为您可能希望在两个窗格中监听鼠标事件,并且可能希望 uiPane 的子项停留在 global_pane 之上。但是在这个简单的例子中,它可以像这样重新排序它们:

private Pane localPane = new Pane(uiPane,global_pane);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。