# jfreeChart



## PollerJava (24. Jul 2007)

Hallo nochmal,


ich hätte noch eine Frage zum Renderer von jFreeChart und zwar möchte ich die Farben der einzelnen Linien bestimmen und wenn ich mit der Maus über eine Linie drüberfahre, dann soll die Linie dicker (hervorgehoben) erscheinen.

Momentan verwende ich diesen Renderer, weiß aber nicht, wie meine Schierigkeiten mir diesem Renderer gelöst werden können:
XYLineAndShapeRenderer

die API befindet sich hier:

http://www.jfree.org/jfreechart/api.html


lg


----------



## DaKo (25. Jul 2007)

Ich habe bisher nur mit TimeSeriesCharts gearbeitet. Daher weiß ich nicht, ob es für dich übertragbar ist, aber trotzdem 

Farben setzen:


```
private final Color[] colors = ....;
JFreeChart chart = ChartFactory.createTimeSeriesChart(<Titel>,<xLabel>, <yLabel>,<dataSet>,
                                                                             true,  //Legende?
                                                                             true,  //Tooltips?
                                                                             false);//URLs?

XYPlot plot = chart.getXYPlot();

XYItemRenderer renderer = plot.getRenderer();

for (int i=0;i<dataSet.getSeriesCount();i++)
	renderer.setSeriesPaint(dataSet.getSeries(i), colors[i%colors.length]);
```

wegen dem mouseOver-Effekt, schau ich gleich mal


----------



## André Uhres (25. Jul 2007)

Ich hab vor langer Zeit mal damit gearbeitet, da hab ich sowas gemacht:

```
JFreeChart chart=null ;
...
        // NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
        CategoryPlot plot = chart.getCategoryPlot();
        plot.setDrawingSupplier(getSupplier());
        // customise the renderer...
        LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
        renderer.setDrawShapes(true);
...
    public DefaultDrawingSupplier getSupplier(){
        return new DefaultDrawingSupplier(
                new Paint[] {
            blueX,
            Color.green,
            Color.red,
            Color.orange,
            Color.magenta,
            Color.cyan,
            Color.pink,
            Color.gray,
            Color.yellow,
            ChartColor.DARK_RED,
            ChartColor.DARK_GREEN,
            ChartColor.LIGHT_RED,
            ChartColor.DARK_YELLOW,
            ChartColor.DARK_MAGENTA,
            ChartColor.DARK_CYAN,
            Color.lightGray,
            ChartColor.LIGHT_RED,
            ChartColor.LIGHT_BLUE,
            ChartColor.LIGHT_GREEN,
            ChartColor.LIGHT_YELLOW,
            ChartColor.LIGHT_MAGENTA,
            ChartColor.LIGHT_CYAN},
                DefaultDrawingSupplier.DEFAULT_OUTLINE_PAINT_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
                DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE
                );
    }
```


----------



## PollerJava (25. Jul 2007)

Hallo,

(PS: der Code unten ist ein vollständiges, funktionsfähiges Beispiel)

vielen Dank für die Antworten,
hab jetzt noch ein großes Problem und zwar wenn ich auf einen Button drücke, dann soll eine Linie gezeichnet werden,
Das Problem beim unteren Code ist, dass die "datasets" erzeugt werden und dann diese auf das Panel "ChartPanel" gegeben werden, ich möchte aber, wenn das "ChartPanel" schon besteht und angezeigt wird, dass ich dann eine Linie draufbekomme.

Ich weiß jetzt nicht genau ob es da irgendwelche Listener gibt oder ob ich das "ChartPanel" neu erzeugen muss?

Vielleicht kann mir da jemand weiterhelfen.

lg 






```
package demo;
import java.awt.Color;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.RefineryUtilities;

public class LineChartDemo2 extends ApplicationFrame {
/**
* Creates a new demo.
*
* @param title the frame title.
*/
public LineChartDemo2(String title) {
super(title);
XYDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
}
/**
* Creates a sample dataset.
*
* @return a sample dataset.
*/
private static XYDataset createDataset() {
XYSeries series1 = new XYSeries("First");
series1.add(1.0, 1.0);
series1.add(2.0, 4.0);
CHAPTER 7. LINE CHARTS 59
series1.add(3.0, 3.0);
series1.add(4.0, 5.0);
series1.add(5.0, 5.0);
series1.add(6.0, 7.0);
series1.add(7.0, 7.0);
series1.add(8.0, 8.0);
XYSeries series2 = new XYSeries("Second");
series2.add(1.0, 5.0);
series2.add(2.0, 7.0);
series2.add(3.0, 6.0);
series2.add(4.0, 8.0);
series2.add(5.0, 4.0);
series2.add(6.0, 4.0);
series2.add(7.0, 2.0);
series2.add(8.0, 1.0);
XYSeries series3 = new XYSeries("Third");
series3.add(3.0, 4.0);
series3.add(4.0, 3.0);
series3.add(5.0, 2.0);
series3.add(6.0, 3.0);
series3.add(7.0, 6.0);
series3.add(8.0, 3.0);
series3.add(9.0, 4.0);
series3.add(10.0, 3.0);
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(series1);
dataset.addSeries(series2);
dataset.addSeries(series3);
return dataset;
}
/**
* Creates a chart.
*
* @param dataset the data for the chart.
*
* @return a chart.
*/
private static JFreeChart createChart(XYDataset dataset) {
// create the chart...
JFreeChart chart = ChartFactory.createXYLineChart(
"Line Chart Demo 2", // chart title
"X", // x axis label
"Y", // y axis label
dataset, // data
PlotOrientation.VERTICAL,
true, // include legend
true, // tooltips
false // urls
);
// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
chart.setBackgroundPaint(Color.white);
// get a reference to the plot for further customisation...
XYPlot plot = (XYPlot) chart.getPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
XYLineAndShapeRenderer renderer
= (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setShapesVisible(true);
renderer.setShapesFilled(true);
// change the auto tick unit selection to integer units only...
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// OPTIONAL CUSTOMISATION COMPLETED.
return chart;
}
/**
* Creates a panel for the demo (used by SuperDemo.java).
*
* @return A panel.
*/
public static JPanel createDemoPanel() {
JFreeChart chart = createChart(createDataset());
return new ChartPanel(chart);
}
/**
* Starting point for the demonstration application.
*
* @param args ignored.
*/
public static void main(String[] args) {
LineChartDemo2 demo = new LineChartDemo2("Line Chart Demo 2");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
```


----------



## André Uhres (25. Jul 2007)

PollerJava hat gesagt.:
			
		

> ..ich möchte aber, wenn das "ChartPanel" schon besteht und angezeigt wird,
> dass ich dann eine Linie draufbekomme..


Ich würde in die Logik, die den Chart erstellt, eine Abfrage machen, 
ob die zusätzliche Linie gezeigt werden soll oder nicht,
und dann den Chart einfach neu erstellen, wenn die Option ändert.


----------



## PollerJava (25. Jul 2007)

Hallo,

kannst Du mir da einen Ansatz geben wie ich die Logik machen könnte, stehe momentan ein bisschen an, mein Problem ist ja, dass, wenn ich einen Button drücke, die Daten aus einer DB hole (das funktioniert alles einwandfrei), dann muss ich eben einen neuen Datensatz  (dataset) erstellen und diesen dann irgendwie auf das ChartPanel bekommen -> aber wie ich den neuen Datensatz auf das ChartPanel bekomme, da stehe ich momentan an.

vielen Dank für Deine/Eure Unterstützung!!

lg


----------



## André Uhres (25. Jul 2007)

PollerJava hat gesagt.:
			
		

> ..kannst Du mir da einen Ansatz geben wie ich die Logik machen könnte..




```
if( zusatzLinie )
   dataset.addValue(..);
```


----------



## PollerJava (25. Jul 2007)

ja das habe ich versucht aber eswird nichts angezeit, ich muss dem ChartPanel noch sagen, dass es sich aktualisieren soll und das ist eben mein Problem, ich weiß nicht ob ich da gleich ein neues ChartPanel erzeugen soll oder wie ich das machen kann??

vielen Dank!!! für die Hilfe!!

lg


----------



## André Uhres (25. Jul 2007)

PollerJava hat gesagt.:
			
		

> ..ich weiß nicht ob ich da gleich ein neues ChartPanel erzeugen soll ..





			
				André Uhres hat gesagt.:
			
		

> ..Ich würde in die Logik, die den Chart erstellt, eine Abfrage machen,
> ob die zusätzliche Linie gezeigt werden soll oder nicht,
> und dann *den Chart einfach neu erstellen*, wenn die Option ändert.


Natürlich musst du ihn dann auch anzeigen :wink:
Eventuell ein validate, revalidate, repaint, updateUI, oder was auch immer machen.


----------



## PollerJava (25. Jul 2007)

vielen Dank für die HILFE!!!!!

es hat geklappt!!!


herzlichen Dank!!


----------

