Как я могу нарисовать линию перекрестия на LineChart после моей позиции мыши - PullRequest
4 голосов
/ 15 мая 2019

Я пытаюсь нарисовать вертикальную линию и горизонтальную линию, указывающую, куда указывает моя мышь, я бы хотел, чтобы мой "курсор" двигался с помощью мыши.

Итак, я попытался добавить линию в свою диаграмму, но не могу что-то добавить, потому что в линейной диаграмме нет функции getChildren (). Таким образом, я хотел бы иметь что-то подобное:

enter image description here

Я также думаю, что если эти «курсоры» могут быть объектами, то, когда я называю свой класс «Курсором», это создаст 2 линии, одну вертикальную и одну горизонтальную?

Мой код:

Я пытался использовать LineBuilder, который рисует линию, но теперь, как я хотел. Теперь мне удалось определить местоположение мыши, как я могу нарисовать 2 линии сейчас?

    NumberAxis x = new NumberAxis();
    NumberAxis y = new NumberAxis();
    LineChart<Number,Number> chart = new LineChart<Number,Number>(x,y);
    XYChart.Series series1 = ...;
     // creating a series then giving this series 100 random values
    chart.getData().add(series1);
    chartPane.getChildren().add(chart);

    chart.setOnMousePressed((MouseEvent event) -> {

    Point2D mouseSceneCoords = new Point2D(event.getSceneX(),       event.getSceneY());
    double x = xAxis.sceneToLocal(mouseSceneCoords).getX();
    double y = yAxis.sceneToLocal(mouseSceneCoords).getY();

    primaryStage.setTitle("" +
        xAxis.getValueForDisplay(x) + ",  " +
        yAxis.getValueForDisplay(y)
    );
});

Итак, теперь, когда мне удалось применить ваш код в моем приложении, у меня возникла проблема: enter image description here Моя мышь указывала на точку (800,10), но мой курсор совершенно далек от местоположения моей мыши.

1 Ответ

5 голосов
/ 15 мая 2019

Ключ использует StackPane.Таким образом, вы можете добавить Pane, который может обрабатывать две строки.Вот грубый пример:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ValueAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class LineChartExperiments extends Application
{

    double mouseX = 0;
    double mouseY = 0;

    @Override
    public void start(Stage primaryStage) throws Exception
    {

        primaryStage.setTitle("LineChart Experiments");

        ValueAxis xAxis = new NumberAxis();
        xAxis.setLabel("No of employees");

        ValueAxis yAxis = new NumberAxis();
        yAxis.setLabel("Revenue per employee");

        LineChart lineChart = new LineChart(xAxis, yAxis);

        XYChart.Series dataSeries1 = new XYChart.Series();
        dataSeries1.setName("2014");

        dataSeries1.getData().add(new XYChart.Data(1, 567));
        dataSeries1.getData().add(new XYChart.Data(5, 612));
        dataSeries1.getData().add(new XYChart.Data(10, 800));
        dataSeries1.getData().add(new XYChart.Data(20, 780));
        dataSeries1.getData().add(new XYChart.Data(40, 810));
        dataSeries1.getData().add(new XYChart.Data(80, 850));

        lineChart.getData().add(dataSeries1);

        Line verticleLine = new Line();
        verticleLine.setStrokeWidth(3);
        Line horizontalLine = new Line();
        horizontalLine.setStrokeWidth(3);

        Pane pane = new Pane(verticleLine, horizontalLine);

        AnimationTimer loop = new AnimationTimer()
        {
            @Override
            public void handle(long now)
            {
                verticleLine.setStartY(0);
                verticleLine.setEndY(pane.getHeight());
                verticleLine.setEndX(mouseX);
                verticleLine.setStartX(mouseX);

                horizontalLine.setStartX(0);
                horizontalLine.setEndX(pane.getWidth());
                horizontalLine.setEndY(mouseY);
                horizontalLine.setStartY(mouseY);
            }
        };

        pane.addEventFilter(MouseEvent.ANY, event -> {
            mouseX = event.getSceneX();
            mouseY = event.getSceneY();

            loop.start();
        });

        StackPane stackPane = new StackPane(lineChart, pane);

        Scene scene = new Scene(stackPane, 400, 200);

        primaryStage.setScene(scene);
        primaryStage.setHeight(500);
        primaryStage.setWidth(700);

        primaryStage.show();

    }

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

** Этот код имеет много недостатков и должен использоваться только в качестве подтверждения концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...