2016-07-26 18 views
2

Ich habe vier Serien auf LineChart. Jede Serie besteht aus einer bestimmten Anzahl von Zeitdiagrammen. Standardmäßig verbindet LineChart diese Graphen. Es sieht hässlich aus und macht im Kontext keinen Sinn, deshalb möchte ich sie trennen, aber die Farbe und die Legende beibehalten. Mit anderen Worten, ich möchte die Verbindung zwischen zwei spezifischen Punkten entfernen. Gibt es eine Möglichkeit, dies zu tun, ohne auf das Hinzufügen neuer Reihen zum Diagramm zu setzen (die Graphen sind logisch verbunden, und das Hinzufügen neuer Reihen würde den Benutzer verwirren und das Diagramm durcheinander bringen)?Gibt es eine Möglichkeit, in JavaFX LineChart 2 Punkte in Reihe zu trennen?

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

Antwort

1

Ja, Sie können

in https://docs.oracle.com/javase/8/javafx/api/javafx/scene/chart/XYChart.Series.html#nodeProperty angegeben, da die Serie Knoten Verwendung ist die Zeile zu speichern. Der Knoten ist ein Pfad, den Sie ändern können.

Blick auf diese kleine App:

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


     } 

    } 
} 

Sie haben die Methode layoutplotchildren außer Kraft zu setzen, die verantwortlich ist, um das Diagramm zu zeichnen (es ist interessant, den Code des Ursprungs Methode, um zu sehen, wenn Sie können).

und dann können Sie hier zeichnen, was Sie wollen.

In meiner kleinen App modifiziere ich nur den Knoten, der bereits erstellt wurde, aber Sie können den Superaufruf weglassen und zeichnen, was Sie wollen.

Schauen Sie sich das Dokument an, das Sie haben, um auf chartelement wie getPlotChildren(), getchartchildren() zuzugreifen.

und Sie können auf die serie Zugriff hinzugefügt, um die Grafik mit getdata()

+0

okay, das ist sehr hilfreich, danke – graynk