簡體   English   中英

如何獲取用於顯示 PopupControl 的 javaFX 節點的 X 和 Y 位置?

[英]How to get the X and Y location of a javaFX node for displaying a PopupControl?

我創建了一個類似於 DatePicker 類的 JavaFX 類,但顯示了一個帶有選擇時間方式的彈出窗口。 我想讓彈出窗口像 DatePicker 彈出窗口一樣出現在 TextField 和 Button 下方,但我無法找到獲取節點的 X 和 Y 坐標的方法。 任何幫助,將不勝感激。

您可以使用以下方法獲取屏幕坐標: node.localToScreen(x,y)

以下代碼將定位(錨定)在彈出窗口所有者窗口節點底部中心的彈出窗口左上角:

Point2D anchorPoint = node.localToScreen(
        node.getWidth() / 2,
        node.getHeight()
);

popup.setAnchorLocation(
        PopupWindow.AnchorLocation.WINDOW_TOP_LEFT
);

popup.show(
        node,
        anchorPoint.getX(),
        anchorPoint.getY()
);

示例應用:

顯示和隱藏位於控制按鈕底部中心的彈出窗口。

第三定律

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import javafx.stage.*;

public class Popcorn extends Application {
    @Override
    public void start(Stage stage) {
        StackPane popupLayout = new StackPane(
                new Label(
                        "Clarke's third law\nAny sufficiently advanced technology is indistinguishable from magic."
                )
        );
        popupLayout.setStyle("-fx-opacity: 0.8; -fx-background-color: paleturquoise;");
        popupLayout.setPadding(new Insets(10));

        Popup popup = new Popup();
        popup.getContent().add(
                popupLayout
        );
        popupLayout.setOnMouseClicked(event -> popup.hide());

        ToggleButton showPopupButton = new ToggleButton("Show popup");

        showPopupButton.textProperty().bind(
                Bindings.when(showPopupButton.selectedProperty())
                        .then("Hide popup")
                        .otherwise("Show popup")
        );

        showPopupButton.selectedProperty().addListener((observable, wasSelected, isSelected) -> {
            if (isSelected) {
                showPopup(popup, showPopupButton);
            } else {
                popup.hide();
            }
        });

        popup.setOnShown(event -> showPopupButton.setSelected(true));
        popup.setOnHidden(event -> showPopupButton.setSelected(false));

        StackPane stageLayout = new StackPane(showPopupButton);
        stageLayout.setPadding(new Insets(10));
        stage.setScene(new Scene(stageLayout));
        stage.show();
    }

    private void showPopup(Popup popup, Control ownerNode) {
        Point2D anchorPoint = ownerNode.localToScreen(
                ownerNode.getWidth() / 2,
                ownerNode.getHeight()
        );

        popup.setAnchorLocation(
                PopupWindow.AnchorLocation.WINDOW_TOP_LEFT
        );

        popup.show(
                ownerNode,
                anchorPoint.getX(),
                anchorPoint.getY()
        );
    }

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

關於彈出錨點的說明

彈出框錨點只是對彈出框系統放置彈出框位置的建議。 JavaFX 內置的彈出邏輯足夠智能,可以知道彈出窗口的大小及其在屏幕上的初始位置。 如果這意味着屏幕上沒有足夠的空間來在建議的錨點處顯示彈出窗口,則彈出窗口實現將自動調整錨點以確保彈出窗口在首次顯示時完全可見。 在嘗試顯示彈出窗口之前,您可以通過運行示例代碼並將所有者階段放置在屏幕的最底部或最右側來嘗試此操作。

暫無
暫無

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

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