Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据鼠标位置在折线图上绘制十字线_Java_Javafx - Fatal编程技术网

Java 如何根据鼠标位置在折线图上绘制十字线

Java 如何根据鼠标位置在折线图上绘制十字线,java,javafx,Java,Javafx,我试图画一条垂直线和一条水平线,指向我的鼠标所指向的地方,我想看到我的“光标”随着鼠标移动 因此,我尝试向图表中添加线条,但无法添加任何内容,因为线条图没有getChildren()函数。因此,我想要这样的东西: 我也在想,如果这些“游标”可以是一个对象,当我调用我的类“游标”时,它会创建两条线,一条垂直线,一条水平线 我的代码: 我曾尝试使用LineBuilder绘制一条线,但现在我想这样做。 现在,我成功地得到了我的鼠标位置,我现在怎么能画两条线呢 NumberAxis x = n

我试图画一条垂直线和一条水平线,指向我的鼠标所指向的地方,我想看到我的“光标”随着鼠标移动

因此,我尝试向图表中添加线条,但无法添加任何内容,因为线条图没有getChildren()函数。因此,我想要这样的东西:

我也在想,如果这些“游标”可以是一个对象,当我调用我的类“游标”时,它会创建两条线,一条垂直线,一条水平线

我的代码:

我曾尝试使用LineBuilder绘制一条线,但现在我想这样做。 现在,我成功地得到了我的鼠标位置,我现在怎么能画两条线呢

    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)
    );
});
NumberAxis x=新的NumberAxis();
NumberAxis y=新的NumberAxis();
线形图=新线形图(x,y);
XYChart.系列系列1=。。。;
//创建一个系列,然后给这个系列100个随机值
chart.getData().add(series1);
chartPane.getChildren().add(图表);
chart.setOnMousePressed((MouseEvent事件)->{
Point2D mouseSceneCoords=新的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)
);
});
因此,现在我成功地在我的应用程序上应用了您的代码,我遇到了一个问题:
我的鼠标指向点(800,10),但我的光标完全远离鼠标的位置

该键正在使用
堆栈窗格
。这样,您可以添加一个
窗格
,该窗格可以处理这两行。下面是一个粗略的例子:

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

**此代码有许多缺陷,只能用作概念证明。

我猜
StackPane
会有所帮助。@Sedrick-chartPane在主播台上,为什么StackPane会更有用?它允许您在图表上放置一个可以处理线条的窗格。@Sedrick这样我的光标就会移动到窗格上,而不是我的图表上?那它就不能用我的鼠标移动了?如果你有新的问题,你应该开始一个新的问题。谢谢你的帮助,我会尝试使它适应我的代码。然而,你认为我能做一个游标构造函数吗?就像一个用两个参数调用的方法:一个窗格和一个图?而且,即使我不在图上,光标也会开始,从图中获取信息不是一个问题吗。例如,我必须使图形可以用光标点击,这样X和Y值就会显示给用户。这段代码更像是一个概念上的废话。在我看来,对每个鼠标操作调用loop.start()都是不正确的。因此,我不会按原样使用代码。我会使用代码中的想法来创建更好的代码。当你使用这些想法并遇到问题时,提出新的问题。