# JFreeChart neu zeichnen sich das Datenset geändert hat.



## semi2183 (16. Jan 2009)

Hallo ich habe folgendes Problem:
Ich habe eine JTable die mir Daten anzeigt. Die Daten der JTable sind in der Klasse ModelTable welche TableModel implementiert.

Die Daten in der Tabelle können sich nun änder. Nach jeder Änderung soll daraus ein neuer LineChar erstellt werden.
Also habe ich einen Klasse geschrieb mit einer Methode die mir ein ChartPanel liefert und das Interface TableModelListener implementiert. Die Methode tableChanged() wird nun auch bei jeder Änderung der Daten aufgerufen. 
In der Methode tableChanged() soll das Datenset des Charts neu erstelt werden und dem Chart oder ChartPanel gesagt werden, das es sich geändert hat. Ich weiß aber nicht wie ich ihn das mitteilen soll.

Kann mir da bitte jemand helfen?


```
public class ModelChart implements ChartModel, TableModelListener {

	private int debug;

	private Model model;
	
	private ChartPanel chatPanel = null;
	private JFreeChart chart = null;
	private LegendTitle legend;
	private XYPlot plot;
	//private StandardXYItemRenderer renderer;
	
	private XYSeriesCollection dataset;
	

	
	/**
	 * @param model
	 * @param debug
	 */
	public ModelChart(Model model, int debug) {
		//DEBUG
		if( debug >= 1 ) { System.out.println("ModelChart#ModelChart -- Konstruktor"); }
		
		this.debug = debug;
		this.model = model;
		this.model.addTableModelListener(this);
		
		//TODO leeres Datenset erstellen
		this.dataset = null;
		
		
	}
	@Override
	public ChartPanel getChartPanel() {
		//DEBUG
		if( debug >= 2 ) { System.out.println("ModelChart#getChartPanel"); }
		if( this.chatPanel == null) {
			this.chatPanel = new ChartPanel( this.getChart() ); 
			this.chart.addChangeListener(this.chatPanel);
		}
		
		return this.chatPanel;
	}
	
	private JFreeChart getChart() {
		//DEBUG
		if( debug >= 2 ) { System.out.println("ModelChart#getChart"); }
		
		if( chart == null )  {
			
			if(this.dataset == null) {
				this.dataset = new XYSeriesCollection();
				XYSeries series1 = new XYSeries("No Values");
				series1.add(1, 1);
				series1.add(2, 2);
				this.dataset.addSeries(series1);
			}			
			
			this.chart = ChartFactory.createXYLineChart("No title yet", "I[A]", "t[s]", this.dataset, PlotOrientation.HORIZONTAL, true, true, false);
			this.chart.setBackgroundPaint(Color.WHITE);
			this.legend = this.chart.getLegend();
			this.legend.setBackgroundPaint(Color.BLUE);
		    
			this.plot = this.chart.getXYPlot();
			this.plot.setBackgroundPaint(Color.LIGHT_GRAY);
			this.plot.setAxisOffset(new RectangleInsets( 5, 5, 5, 5 ));
		}
		return this.chart;
	}
	
	
	private XYSeriesCollection getChartData( List<TableRow> indata ) {
		//DEBUG
		if( debug >= 2 ) { System.out.println("ModelChart#getChartData"); }
		
		this.model.setStatusText("Erstelle Dut Diagram");
		
		XYSeriesCollection localdataset = new XYSeriesCollection();
		Iterator<TableRow> it_indata = indata.iterator();
		
		XYSeries series1 = new XYSeries("DUT" + indata.get(0).getDutNumber() );
		
		while( it_indata.hasNext() ) {
			TableRow row = it_indata.next();
			series1.add(row.getTime(), row.getCurrent());	
		}
		
		localdataset.addSeries(series1);
		
		return localdataset;
	}
	

	@Override
	public void tableChanged(TableModelEvent e) {
		//DEBUG
		if( debug >= 2 ) { System.out.println("ModelChart#tableChange"); }
		
		this.dataset = this.getChartData( this.model.getSelectedDataList() );

		if(this.debug >= 3 ) { System.out.println("ModleChart#tableChanged -- Neues Dataset. chartChanged wir aufgerufen!"); }
		this.chatPanel.chartChanged(new ChartChangeEvent(this, this.chart, ChartChangeEventType.NEW_DATASET));
			}
}
```


----------



## SlaterB (16. Jan 2009)

ich schlage vor, du verwendest bei Änderungen das alte DataSet weiter,
rufst
removeAllSeries() 
auf und fügst deine neuen ein


----------



## semi2183 (16. Jan 2009)

Ist mal wieder vom Type: "Gut das wir darüber gesprochen haben."

Es ist noch nicht perfekt. Er zeigt irgendwas an, aber es ändert sich wenn sich die Daten in der JTable ändern.

Ich bin dazu übergegangen, das datenset nicht neu zu setzen, sondern aus dem "alten Datenset" alle Datenserien heraus zu schmeißen und mit neuen Datenserien zu füllen.

Das ändert zumindestens die Anzeige.


----------



## semi2183 (16. Jan 2009)

@SlaterB du warst einfach schneller ! Aber Danke


----------



## semi2183 (16. Jan 2009)

Ok jetzt past auch die Darstellung. Der Fehler lag bei der Daten Quelle.

Wie zum Teufel kann man das Thema als gelößt makieren?


----------

