JFreeChart - ändern SeriesStroke der chart-Linien vom festen in den gestrichelt in einer Zeile
Die Antwort hier akzeptiert (JFreechart(Java) - gewusst Wie: zeichnen von Linien, die teilweise gestrichelte Linien und teilweise durchgezogene Linien?) hat mir geholfen, beginnen Sie den Pfad zu ändern meine seriesstroke Linien in meinem chart. Nachdem wir durch meinen code und beobachten Sie die Veränderungen, die ich sehe, dass meine seriesstroke, hat in der Tat zu ändern "dashedStroke", wenn es soll (nach einem bestimmten Datum "dashedAfter"), aber beim Rendern des Diagramms werden die gesamte Serie Linie ist gestrichelt. Wie kann ich eine Serie Linie gezeichnet werden, der solide auf den ersten und schoss nach einem Datum?
/* series line modifications */
final Number dashedAfter = timeNowDate.getTime();
XYLineAndShapeRenderer render = new XYLineAndShapeRenderer() {
Stroke regularStroke = new BasicStroke();
Stroke dashedStroke = new BasicStroke(
1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
1.0f, new float[] {10.0f, 6.0f}, 0.0f );
@Override
public Stroke getItemStroke(int row, int column) {
Number xVal = cd.getXValue(row, column);
if (xVal.doubleValue() > dashedAfter.doubleValue()) {
return dashedStroke;
} else {
return regularStroke;
}
}
};
render.setBaseShapesVisible(false);
render.setBaseShapesFilled(true);
render.setDrawSeriesLineAsPath(true);
plot.setRenderer(render);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, die Umsetzung
AbstractRenderer#getItemStroke
?In diesem Beispiel verwende ich eine gestrichelte Linie, für x > 4 zur Reihe 2:
Obwohl in diesem Beispiel ist die Verwendung und
XYSeries
und nicht Daten, Sie soll in der Lage sein, es zu ändern, für Sie braucht.Hier ist das vollständige Beispiel
ChartFactory.createTimeSeriesChart
. Würde dies das Problem sein?Den
setDrawSeriesLineAsPath()
Methode "steuert, ob jede Reihe gezeichnet wird, als einen einzigen Weg." Dies schließt das ändern derStroke
dynamisch, alsgetItemStroke()
aufgerufen, nur einmal pro Serie.Nachtrag: Eine einfache Möglichkeit dies zu überprüfen ist zu berufen
setDrawSeriesLineAsPath()
im @GrahamA Beispiel und brechen indrawFirstPassShape()
im debugger.ChartPanel#setMouseWheelEnabled(true)
für einfaches Zoomen. Ich nehme an, Sie könnten damit der Benutzer schaltet die Ansicht wie gewünscht, für Beispiel.Ich denke, dass Sie es richtig machen und wenn es nicht funktioniert, vielleicht ist es nicht möglich? Im hier nur raten, aber könnte man ziehe 2 Linien anstelle von 1. Die zweite Zeile beginnen würde, wo Sie Ihre erste Zeile endet. Das könnte chaotisch, wenn Sie möchten, ändern Sie den Schlaganfall eine Menge und wie Sie es ändern wollen, jede iteration der Schleife je nach Bedingung, Ihr code wird wahrscheinlich eine Menge mehr kompliziert. Oder ziehen Sie einfach eine neue Zeile für jeden.