系列消失到窗口大小调整(JavaFX)

系列消失到窗口大小调整(JavaFX),javafx,charts,window,Javafx,Charts,Window,我对JavaFX有问题;我解释:我有一个类,有5个系列要绘制,但有4个是散点图点,一个是实线图1。折线图在X轴和Y轴上的参数持续较低,高于其他四个系列,因此我需要做更多的计算。我插入绘制图形的控制器类的代码: public class ControllerFormantsSmooth { public static void plotFormantSmooth(String path, Stage stage, String name) { fi

我对JavaFX有问题;我解释:我有一个类,有5个系列要绘制,但有4个是散点图点,一个是实线图1。折线图在X轴和Y轴上的参数持续较低,高于其他四个系列,因此我需要做更多的计算。我插入绘制图形的控制器类的代码:

    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();
            }
        }
    }
那么这里的窗口是: 这正是我想要的! 但如果我调整窗口的大小并放大,结果是该图形消失一条实线:


我只是不明白为什么。。。你有主意吗?提前感谢那些想帮助我的人。

图表的布局似乎有问题。 您可以使用如下自定义类替换container 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);
使用


谢谢你的回答,但是我无法查看折线图。同时,我使用了另一个策略-反转子对象:stackpane.getChildren。添加所有散射共振峰,lineChartFull;-玩两个图形的不透明度。我希望这对其他人有帮助。我曾尝试用模拟数据复制您的代码,我可以看到这两个图表。显然,你也必须用我的代码设置不透明度。那对你不管用吗?
StackedCharts stackpane = new StackedCharts();
stackpane.addBottom(lineChartFull);
stackpane.addTop(scatterFormant);