java - 如何确定javafx的折线图在监视器上的峰值位置

标签 java javafx charts location

基本上,当我将鼠标悬停在其中一个山峰上时,我想显示带有一些额外信息的工具提示。

但是,我无法猜测如何在监视器上获取该峰值的位置(因为工具提示要求提供监视器的绝对坐标)

这是我当前的代码

//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);
    }
}

关于java - 如何确定javafx的折线图在监视器上的峰值位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155978/

相关文章:

java - 解析 RSS 提要

java - Ubuntu 上的 JaxaFX 着色器问题 : Help translate error

.net - 我应该在Windows Forms Chart Control中选择Line还是FastLine?

javascript - Highcharts 图表在 zoomType : 'x' area range zoom? 上变为空白

java - 如何通过发送列表从数据库获取数据?

java - 使用滚动方法设置日历字段

JavaFX,可观察列表 : How to fire an InvalidationListener whenever an object of the list gets modified?

java - 在 start 方法中与 FXML 元素交互时如何修复 NullPointerException?

javascript - 在Extjs中,有没有一种方法可以在没有数据时删除3D条形图中的条形标记颜色?

java - 方法未返回正确的总计