亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaFX 折線圖點操作

JavaFX 折線圖點操作

呼啦一陣風 2022-06-15 15:46:14
我正在嘗試設置一個折線圖,以便當單擊并拖動它的值時,它的值和位置會隨著圖表的相應調整而發生變化。我目前創建了 4 個固定點的圖表: 這兩個中間點稍后將添加到 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 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

快速而骯臟,但我相信這可以滿足您的要求。需要注意的是,該點在運動時往往會明顯抖動,并且不能很好地調整大小。我懷疑這些問題可以通過更多的故障排除來解決,但希望這能讓你開始。


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;

}

}


查看完整回答
反對 回復 2022-06-15
  • 1 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號