如何解决如何防止窗格交叉阻塞另一个窗格? 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 举报,一经查实,本站将立刻删除。