2017-02-06 14 views
0

JavaFXに問題があります。私は説明する:私はプロットされる5系列のクラスを持っているが、4つは散布図(点)と線図1(実線)である。折れ線グラフは、他の4つのシリーズよりもX軸とY軸の方が低いパラメータを続けているため、もう少し計算する必要があります。 Correct そして、それは正しいですが、私は、ウィンドウのサイズを変更する場合(拡大(私が欲しいものだけ!):次に、ここでウィンドウがこれですウィンドウのサイズ変更(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(); 
      } 
     } 
    } 

:私は、グラフを描画するコントローラクラスのコードを挿入します)結果は次のようになります(グラフは実線で消えます)。

Incorrect 私はなぜ理にかなっていません...アイデアはありますか?私を助けたい人に前もって感謝します。

答えて

1

グラフのレイアウトに問題があるようです。 次のようなカスタムクラスをコンテナStackPaneを置き換えることができます:

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

    } 

} 

と答えのために、代わりに使用

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

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

おかげで、しかし、私がすることはできません折れ線グラフを表示します。 私はその間に別の方法を使用しました - 子を逆にしました:stackpane.getChildren()。 AddAll(scatterFormant、lineChartFull); - 2つのグラフのsetOpacity()で再生しました。 私はそれが他の人に助けになることを願っています –

+0

私は模擬データであなたのコードを複製しようとしました、そして私は両方のチャートを見ることができました。明らかに、コードで不透明度を設定し続ける必要があります。それはあなたのために働かなかったか? – negste

関連する問題