簡體   English   中英

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

[英]How do i prevent pane intersection blocking another pane? 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, 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);
    }
}

正如您已經注意到的那樣, uiPane位於global_pane的頂部,因此會消耗所有應該到達globalPaneR矩形的鼠標事件。 在此示例中,可以通過多種方式克服此問題:

選項 1(最通用) :將“阻塞”窗格的pickOnBounds屬性值設置為false

uiPane.setPickOnBounds(false);

文檔說明了pickOnBoundsProperty

定義當由 MouseEvent 或 contains function 調用觸發時如何為此節點完成拾取計算。 如果 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM