JavaFX Linechart Point Manipulation - PullRequest
       0

JavaFX Linechart Point Manipulation

0 голосов
/ 11 февраля 2019

Я пытаюсь настроить линейную диаграмму таким образом, чтобы при щелчке по бинту и его перетаскивании его значение и положение изменялись с соответствующим графиком.В настоящее время я создал график из 4 фиксированных точек: Graph generated by code

Две средние точки будут позже добавлены в текстовые поля, где R = ось X и S = ​​ось Y,Можно ли перетаскивать и перемещать средние точки, чтобы график обновлялся в режиме реального времени?Код для создания графа выглядит следующим образом:

private void setContrastChart() {
                NumberAxis xAxis = new NumberAxis();
                NumberAxis yAxis = new NumberAxis();
                LineChart<Number,Number> contrastChart =
                        new LineChart<>(xAxis,yAxis);
                XYChart.Series series = new XYChart.Series();
                series.setName("ContrastValues");
                //populating the series with data
                series.getData().add(new XYChart.Data(0, 0));
                series.getData().add(new XYChart.Data(75, 75));
                series.getData().add(new XYChart.Data(150, 150));
                series.getData().add(new XYChart.Data(255, 255));
                contrastChart.setMaxWidth(255);
                contrastChart.setMaxHeight(255);
                contrastChart.setLegendVisible(true);
                chartHolder.getChildren().add(contrastChart);
                contrastChart.getData().add(series);
                txtR1.setText("75");
                txtS1.setText("75");
                txtR2.setText("150");
                txtS2.setText("150");
        }

1 Ответ

0 голосов
/ 12 февраля 2019

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

public class Main extends Application {

private Stage window;
private double chartMaxX;
private double chartMinX;
private double chartMaxY;
private double chartMinY;

@Override
public void start(Stage primaryStage) {
    try {

        window = primaryStage;

        NumberAxis xAxis = new NumberAxis();
        NumberAxis yAxis = new NumberAxis();

        xAxis.setAutoRanging(false); //prevent automatic resizing for simplicity
        yAxis.setAutoRanging(false); //prevent automatic resizing for simplicity


        chartMaxX = 250.0;
        chartMinX = 0.0;

        chartMaxY = 300.0;
        chartMinY = 0.0;

        /*
         * ranges of Axis are preset for simplicity, but could be altered without much trouble
         */

        xAxis.setUpperBound(chartMaxX);
        xAxis.setLowerBound(chartMinX);

        yAxis.setUpperBound(chartMaxY);
        yAxis.setLowerBound(chartMinY);

        LineChart<Number,Number> contrastChart = new LineChart<>(xAxis,yAxis);
        XYChart.Series<Number, Number> series = new XYChart.Series<>();
        series.setName("ContrastValues");
        //populating the series with data
        Data<Number, Number> d0 = new Data<Number, Number>(10, 10);
        Data<Number, Number> d1 = new Data<Number, Number>(75, 75);
        Data<Number, Number> d2 = new Data<Number, Number>(150, 150);
        Data<Number, Number> d3 = new Data<Number, Number>(240, 240);

        series.getData().add(d0);
        series.getData().add(d1);
        series.getData().add(d2);
        series.getData().add(d3);

        contrastChart.setLegendVisible(true);
        contrastChart.getData().add(series);

        contrastChart.setAnimated(false); //prevent animations, as they will pull the point out of sync with the cursor.

        for(Data<Number, Number> point: series.getData()) {
            point.getNode().setOnMouseDragged(event -> {

                Point2D translateXY = point.getNode().screenToLocal(event.getScreenX(), event.getScreenY());

                point.setXValue(translateXY.getX()+point.getXValue().doubleValue());
                point.setYValue(reverseNumberInRange(translateXY.getY()+(chartMaxY-point.getYValue().doubleValue()), chartMinY, chartMaxY));
            });
        }

        //SCENE
        Scene myScene = new Scene(contrastChart, chartMaxY, chartMaxX);
        window.setScene(myScene);
        window.show();

    } catch(Exception e) {
        e.printStackTrace();
    }
}

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

public double reverseNumberInRange(double value, double minVal, double maxVal) {
    /*
     * y0 is top left on screen, and bottom left in chart, need to reverse.
     */
    return (maxVal + minVal) - value;
}

}

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