2017-02-06 8 views
0

Ich habe ein Problem mit JavaFX; Ich erkläre: Ich habe eine Klasse mit 5 zu zeichnenden Reihen, aber 4 sind Streudiagramm (Punkte) und ein Liniendiagramm 1 (durchgezogene Linie). Das Liniendiagramm hat die unteren Parameter auf der X- und Y-Achse höher als die anderen vier Serien und deshalb muss ich ein wenig mehr rechnen. Ich fügen Sie den Code der Controller-Klasse, die das Diagramm zeichnet:Verschwinden der Serie in der Fenstergröße (JavaFX)

public class ControllerFormantsSmooth { 

     public static void plotFormantSmooth(String path, Stage stage, String name) { 
      final NumberAxis xAxis = new NumberAxis(); //asseX 
      final NumberAxis yAxis = new NumberAxis(); //asseY 
      //POINT GRAPH 
      final ScatterChart<Number, Number> scatterFormant = new ScatterChart<Number, Number>(xAxis, yAxis); 

      //SOLID LINE GRAPH 
      final LineChart<Number, Number> lineChartFull = new LineChart<Number, Number>(xAxis, yAxis); 

      ArrayList<Double> extractedF1; 
      ArrayList<Double> extractedF2; 
      ArrayList<Double> extractedF3; 
      ArrayList<Double> extractedF4; 

      ArrayList<Double> extractedTimeF1; 

      ArrayList<Double> extractedData; 
      ArrayList<Double> extractedTime; 

      //Gestione e settaggio del grafico 
      scatterFormant.getData().clear(); 
      scatterFormant.setOpacity(0.8); 
      scatterFormant.getStyleClass().add("CSSformant"); 
      scatterFormant.setAnimated(true); 
      scatterFormant.autosize(); 
      xAxis.setLabel("Time(ms)"); 
      yAxis.setLabel("Formant(Hz)"); 

      //Gestione e settaggio del grafico 
        lineChartFull.getData().clear(); 
        lineChartFull.setOpacity(0.8); 
        lineChartFull.setCreateSymbols(false); 


      try { 

       //POPULATE LIST 
       extractedF1 = FormantExtractor.pointF1(); 
       extractedF2 = FormantExtractor.pointF2(); 
       extractedF3 = FormantExtractor.pointF3(); 
       extractedF4 = FormantExtractor.pointF4(); 

       extractedTimeF1 = FormantExtractor.timeF1(); 

       AudioWaveformCreator.waveForm(path); 
       extractedData = AudioWaveformCreator.audioPoints(); 
       extractedTime = AudioWaveformCreator.pointTimeOscillo(); 

//POINT SERIES 
       XYChart.Series<Number, Number> seriesF1 = new XYChart.Series<Number, Number>(); 
       XYChart.Series<Number, Number> seriesF2 = new XYChart.Series<Number, Number>(); 
       XYChart.Series<Number, Number> seriesF3 = new XYChart.Series<Number, Number>(); 
       XYChart.Series<Number, Number> seriesF4 = new XYChart.Series<Number, Number>(); 

//LINE SERIE 
       XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>(); 
       /* 
       * A ogni serie viene aggiunta una formante 
       */ 
       for (int i = 0; i < extractedF1.size()-1; i++) { 
        if(extractedF1.get(i)+1>extractedF1.get(i+1) && extractedF1.get(i+1)+1>extractedF1.get(i) && 
          extractedF1.get(i)<FormantExtractor.getF1_avg()+50 && extractedF1.get(i)>FormantExtractor.getF1_avg()-50){ 
         seriesF1.getData().add(new XYChart.Data<Number, Number>(extractedTimeF1.get(i), extractedF1.get(i)));   
        } 
       } 
       for (int i = 0; i < extractedF2.size()-1; i++) { 
        if(extractedF2.get(i)+10>extractedF2.get(i+1) && extractedF2.get(i+1)+10>extractedF2.get(i) && 
          extractedF2.get(i)<FormantExtractor.getF2_avg()+50 && extractedF2.get(i)>FormantExtractor.getF2_avg()-50){ 
         seriesF2.getData().add(new XYChart.Data<Number, Number>(extractedTimeF2.get(i), extractedF2.get(i))); 
        } 
       } 
       for (int i = 0; i < extractedF3.size()-1; i++) { 
        if(extractedF3.get(i)+10>extractedF3.get(i+1) && extractedF3.get(i+1)+10>extractedF3.get(i) 
          && extractedF3.get(i)<FormantExtractor.getF3_avg()+50 && extractedF3.get(i)>FormantExtractor.getF3_avg()-50){ 
         seriesF3.getData().add(new XYChart.Data<Number, Number>(extractedTimeF3.get(i), extractedF3.get(i))); 
        } 
       } 
       for (int i = 0; i < extractedF4.size()-1; i++) { 
        if(extractedF4.get(i)+10>extractedF4.get(i+1) && extractedF4.get(i+1)+10>extractedF4.get(i) 
          && extractedF4.get(i)<FormantExtractor.getF4_avg()+50 && extractedF4.get(i)>FormantExtractor.getF4_avg()-50){ 
         seriesF4.getData().add(new XYChart.Data<Number, Number>(extractedTimeF4.get(i), extractedF4.get(i))); 
        } 
       } 



       for (int i = 0; i < extractedData.size(); i= i+100) { 
        series.getData().add(new XYChart.Data<Number, Number>(extractedTime.get(i)*2550, (extractedData.get(i)/10))); 
       } 


       scatterFormant.getData().addAll(seriesF1,seriesF2,seriesF3,seriesF4); 
       lineChartFull.getData().add(series); 

       StackPane stackpane = new StackPane(); 
       stackpane.getChildren().addAll(lineChartFull,scatterFormant); 

       //CREATE WINDOW 
       Scene scene = new Scene(stackpane, 1000, 600); 

       scatterFormant.getStylesheets().add("application/application.css"); 
       stage.setScene(scene); 
       stage.show(); 
       scatterFormant.setLegendVisible(false); 
       //lineChartFull.setLegendVisible(false);; 
      } catch (java.lang.Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Dann wird das Fenster hier ist diese: Correct Und es ist richtig (genau das, was ich will!) Aber wenn ich die Größe des Fensters (vergrößern das Ergebnis) ist dies (graph, der durch eine durchgezogene Linie verschwindet):

Incorrect ich kann einfach nicht verstehen, warum ... Sie Ideen? Vielen Dank im Voraus an diejenigen, die mir helfen wollen.

Antwort

1

Es scheint ein Problem mit dem Layout der Diagramme.

import javafx.scene.Node; 
import javafx.scene.Parent; 
import javafx.scene.layout.StackPane; 

/** 
* Container calss for two overlayed charts 
*/ 
public class StackedCharts extends StackPane { 

    private Parent _bottomNode = null; 
    private Parent _topNode = null; 

    /** 
    * adds node as first child (i.e. bottom) 
    * 
    * @param pNode 
    */ 
    void addBottom(Parent pNode) { 
     _bottomNode = pNode; 
     getChildren().add(0, pNode); 
    } 

    /** 
    * adds node as second child (i.e. top) 
    * 
    * @param pNode 
    */ 
    void addTop(Parent pNode) { 
     _topNode = pNode; 
     getChildren().add(pNode); 
    } 

    public Node getBottomNode() { 
     return _bottomNode; 
    } 

    public Node getTopNode() { 
     return _topNode; 
    } 

    /** 
    * Corrects the problem with overlayed charts 
    */ 
    @Override 
    protected void layoutChildren() { 

     _topNode.layout(); 
     _bottomNode.layout(); 

     super.layoutChildren(); 

    } 

} 

und dann statt

StackPane stackpane = new StackPane(); 
stackpane.getChildren().addAll(lineChartFull,scatterFormant); 

Verwendung

StackedCharts stackpane = new StackedCharts(); 
stackpane.addBottom(lineChartFull); 
stackpane.addTop(scatterFormant); 
+0

Danke für die Antwort, aber so kann ich nicht: Sie könnten den Behälter StackPane mit einer benutzerdefinierten Klasse wie folgt ersetzen Sehen Sie sich das Liniendiagramm an. Ich benutzte es in der Zwischenzeit einen anderen Trick - Umgekehrt die Kinder: stackpane.getChildren(). AddAll (scatterFormant, lineChartFull); - Und spielte mit der setOpacity() der beiden Graphen. Ich hoffe, es hilft anderen –

+0

Ich habe versucht, Ihren Code mit Mock-Daten zu replizieren und ich konnte beide Diagramme sehen. Offensichtlich müssen Sie die Deckkraft auch mit meinem Code einstellen. Hat das nicht für dich funktioniert? – negste

Verwandte Themen