2016-07-26 44 views
2

我在LineChart上有四個系列。每個系列都包含一些時間分割的圖形。默認情況下,LineChart連接這些圖形。它看起來很醜,在上下文中沒有意義,所以我想分開它們,但保留顏色和圖例。換句話說,我想要刪除兩個特定點之間的連接。有沒有辦法做到這一點,而不是訴諸向圖表添加新的系列(圖表邏輯連接,並添加新的系列會混淆用戶和混亂的圖表)?有沒有辦法在JavaFX LineChart中串聯兩個點?

for(int j = 0; j < 4; j++) { 
    XYChart.Series<Float, Float> series = new XYChart.Series<>(); 
    series.setName("Канал " + (j + 1)); 
    fillWithData(series); 
    chart.getData().add(series); 
} 

enter image description here

回答

1

是的,你可以

正如https://docs.oracle.com/javase/8/javafx/api/javafx/scene/chart/XYChart.Series.html#nodeProperty指出意甲節點是用來存儲線。該節點是您可以修改的路徑。

看看這個小程序:

package application; 

import java.util.Arrays; 
import java.util.List; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.chart.Axis; 
import javafx.scene.chart.LineChart; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.scene.chart.XYChart.Data; 
import javafx.scene.chart.XYChart.Series; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.MoveTo; 
import javafx.scene.shape.Path; 
import javafx.stage.Stage; 


public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 

      NumberAxis xAxis = new NumberAxis(); 
      NumberAxis yAxis = new NumberAxis(); 
      MyLineChart chart = new MyLineChart(xAxis, yAxis, Arrays.asList(5)); 


      XYChart.Series<Number, Number> serie = new Series<>(); 

      serie.getData().add(new Data<Number, Number>(0, 5)); 
      serie.getData().add(new Data<Number, Number>(1, 5)); 
      serie.getData().add(new Data<Number, Number>(2, 5)); 
      serie.getData().add(new Data<Number, Number>(3, 5)); 
      serie.getData().add(new Data<Number, Number>(4, 5)); 
      serie.getData().add(new Data<Number, Number>(5, -5)); 
      serie.getData().add(new Data<Number, Number>(6, -5)); 
      serie.getData().add(new Data<Number, Number>(7, -5)); 

      chart.getData().add(serie); 

      Path p = (Path) serie.getNode();   

      Scene scene = new Scene(chart,400,400); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 



    } 

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

    private static class MyLineChart extends LineChart<Number,Number>{ 


     private List<Integer> breakpointIndex; 

     public MyLineChart(Axis<Number> xAxis, Axis<Number> yAxis, List<Integer> breakpointIndex) { 
      super(xAxis, yAxis); 
      this.breakpointIndex = breakpointIndex; 
     } 

     @Override 
     protected void layoutPlotChildren() { 
      super.layoutPlotChildren(); 

      Path p = (Path) getData().get(0).getNode(); 

      breakpointIndex.forEach(i ->{ 

       Data<Number, Number> discontinuousPoint = getData().get(0).getData().get(i+1); 
       p.getElements().add(i+1, new MoveTo(getXAxis().getDisplayPosition(discontinuousPoint.getXValue()), getYAxis().getDisplayPosition(discontinuousPoint.getYValue()))); 

      }); 

      System.out.println("\nnew Path :"); 
      p.getElements().forEach(e -> System.out.println("p : " + e)); 


      //getPlotChildren().add(new Circle(50)); 


     } 

    } 
} 

你必須要覆蓋的方法layoutplotchildren,負責繪製圖表(這是有趣的,如果你可以在原點方法的代碼)。

然後你可以在這裏畫出你想要的。

在我的小應用程序中,我只是修改已創建的節點,但您可以省略超級調用並繪製您想要的內容。

看看你有方法來訪問像getPlotChildren(),getchartchildren()的圖元的文檔。

並且您可以訪問使用getdata添加到圖表中的系列()

+0

好的,這是非常有幫助的,謝謝 – graynk

相關問題