簡體   English   中英

如何在監視器上確定javafx的折線圖峰值位置

[英]How to determine javafx's line chart peak location on monitor

基本上,當我將鼠標懸停在其中一個峰上時,我想顯示一些附加信息的工具提示。

但是,我無法猜測如何在顯示器上獲得該峰的位置(因為工具提示要求您提供顯示器的絕對坐標)

這是我當前的代碼

//dateNumberData is the peak

Tooltip tooltip = new Tooltip();
//Here i just edit tooltip info
dateNumberData.getNode().setOnMouseEntered(event -> {
    tooltip.show(dateNumberData.getNode(),
        dateNumberData.getNode().localToScreen(dateNumberData.getNode().getLayoutX(), 0).getX(),
        dateNumberData.getNode().localToScreen(0, dateNumberData.getNode().getLayoutY()).getY());
    });
dateNumberData.getNode().setOnMouseExited(event -> tooltip.hide());

但是工具提示隨處可見。 如果我使用dateNumberData.getNode().getParent().localToScreen()工具提示根本沒有出現(但是tooltip.getX()返回的是正確的坐標。至少應該與那些坐標一起出現)

layoutX()layoutY()屬性不是在此處使用的正確屬性。 這些可能是父節點中節點的坐標,盡管您不知道通過設置這些節點來定位該節點:例如,它可能使用平移或其他某種布局機制。 而是使用getBoundsInLocal() ,然后變換邊界。

向工具提示添加一個小的偏移量也是一個好主意:這不僅看起來更好,而且還可以防止工具提示使節點模糊,這意味着您觸發了鼠標退出,並最終導致重復循環。

dateNumberData.getNode().setOnMouseEntered(event -> {

    Bounds bounds = dateNumberData.getNode().localToScreen(dateNumberData.getNode().getBoundsInLocal());
    tooltip.show(dateNumberData.getNode(),
        bounds.getMaxX()+15,
        bounds.getMaxY()+5);
    });

這是一個SSCCE:

import java.util.Random;

import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class LineChartWithTooltip extends Application {

    @Override
    public void start(Stage primaryStage) {
        LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis());
        Series<Number, Number> series = new Series<>();
        series.setName("Data");
        Random rng = new Random();
        for (int i = 0 ; i <= 10; i++) {
            series.getData().add(new Data<>(i, rng.nextDouble()));
        }
        chart.getData().add(series);

        Tooltip tooltip = new Tooltip();
        for (Data<Number, Number> d : series.getData()) {
            d.getNode().setOnMouseEntered(event -> {
                tooltip.setText(String.format("[%d, %.3f]", d.getXValue().intValue(), d.getYValue().doubleValue()));
                Bounds nodeBounds = d.getNode().getBoundsInLocal();
                Bounds nodeBoundsInScreen = d.getNode().localToScreen(nodeBounds);
                tooltip.show(d.getNode(),
                        nodeBoundsInScreen.getMaxX()+15,
                        nodeBoundsInScreen.getMaxY()+5);
                    });
            d.getNode().setOnMouseExited(event -> tooltip.hide());
        }

        primaryStage.setScene(new Scene(new BorderPane(chart), 600, 600));
        primaryStage.show();
    }

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

暫無
暫無

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

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