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: 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):
ich kann einfach nicht verstehen, warum ... Sie Ideen? Vielen Dank im Voraus an diejenigen, die mir helfen wollen.
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 –
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