【问题标题】:How do i prevent pane intersection blocking another pane? javafx如何防止窗格交叉点阻塞另一个窗格? javafx
【发布时间】:2021-03-15 10:31:27
【问题描述】:

因此,在示例代码中,我有两个窗格(现在为 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, 50);
        Rectangle globalPaneR = new Rectangle(600, 600, 50, 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);
    }
}

【问题讨论】:

  • 在顶部(z 顺序)级别使用窗格的 pickOnBounds .. 将其设置为 false 将使事件通过(如果没有由其任何子级处理)。几个不相关的 cmets:a)不要对任何东西使用静态范围 b)在公开显示代码时坚持 java 命名约定(你几乎在那里,除了下划线:)
  • 谢谢,我会试试的!
  • Group 会比Pane 更适合吗?

标签: java javafx interaction pane


【解决方案1】:

正如您已经注意到的,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);

【讨论】:

  • 感谢您的详细回答,我一定会开始使用组而不是窗格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多