JFreeChart und das updaten

Status
Nicht offen für weitere Antworten.

Giftstachel

Bekanntes Mitglied
Hallo liebe Kundigen des fröhlichen Codens.

Ich hoffe, Ihr könnt mir helfen, ich selbst kann es leider nicht mehr, da ich mir schon seit fast 2 wochen den kopf über folgendes problem zerbreche.

ich würde gerne einen live-chart programmieren, der mir alle paar sekunden daten aus einer datenbank in den chart schreibt, und dieses grafisch ausgibt.
db-anbindung, und alles andere klappt, jedoch wird bei mir im chart nur der erste datensatz angezeigt, und trotz neuer daten nicht verändert.

auf gut deutsch, das fireChartChanged(); klappt nicht.
ist es möglich, das ich irgendwo einen listener vergessen habe, oder der chart noch einen repaint braucht?
ich hab zwar schon alles mögliche ausprobiert, aber vielleicht hab ich was übersehen..

hier eine abgewandelte klasse des charts

Code:
package ausleser;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeListener;

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.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.RefineryUtilities;

public class testchart extends JFrame {

	public testchart(){
	    	super("mainTable");
	    	boolean isrunning = true;
	    	int firstRun = 0;
	    	
	    	while (isrunning == true)
	        {
	    		hilfsi++;
	    		System.out.println("mein main hilfsi = " + hilfsi);
	            try
	            {
	            	if (firstRun == 0)
	                {
	            		firstRun = 1;
	            		System.out.println("this.chartErzeugen();");
	            		this.chartErzeugen();
	            		this.initGUI();
	                   
	                }  
	            	SwingUtilities.invokeLater(new Runnable() {
	            		public void run() {
	            			System.out.println("Charts.this.chartUpdate(); ");
	            			testchart.this.updateChart(createDataset()); 
	            		}
	            	});
	                Thread.sleep(2000);
	                System.out.println("hab gut geschlafen");
	            }
	            catch (InterruptedException e)
	            {
	                e.getMessage();
	            }
	            catch (NullPointerException nullpe){}
	            catch (ArrayIndexOutOfBoundsException aioobex){}
	        }
	    }
	
	JFrame frame = new JFrame();
	JFreeChart chart;
	int hilfsi = 0;
	ChartPanel chartPanel = new ChartPanel(chart);
	
	
    public testchart(final String title) {
        final CategoryDataset dataset = createDataset();
        final JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(500, 270));
    }

    private CategoryDataset createDataset() {

    	final String series1 = "Serie 1";

        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        int i = 0;
        double j = 0;
        double [] data = this.daten();
        String [] type = this.typus();
        while (i < 50){
        	dataset.addValue(data[i], series1, type[i]);
        	i++;
	       	j = j + 1.0;
        }

        return dataset;                
    }
    
    double []dataSet = new double[50];
    public double [] daten(){
    	int i = 0;
    	while(i < 50){
    		dataSet[i]= hilfsi + hilfsi/2;
                hilfsi++;
    		i++;
    		System.out.println("mein data hilfsi = " + hilfsi);
    	}
    	System.out.println(dataSet[0]);
    	return dataSet;
    }
    String []typen = new String[50];
    
    public String [] typus(){
    	int i = 0;
    	while(i < 50 ){
    		typen[i]=String.valueOf(hilfsi + hilfsi/3);
    		i++;
    		System.out.println("mein typus hilfsi = " + hilfsi);
    		System.out.println(typen[0]);
    	}
    	return typen;
    }
    
    public void chartErzeugen(){
    	chart = createChart(this.createDataset());
    }
    
    public void updateChart(CategoryDataset dataset){
    	this.createDataset().addChangeListener(this.chart.getCategoryPlot());
    	dataset.addChangeListener(this.chart.getCategoryPlot());
    	chart.fireChartChanged();
    	chartPanel.repaint();
    	frame.repaint();
    }   

    private JFreeChart createChart(final CategoryDataset dataset) {
    	final JFreeChart chart = ChartFactory.createLineChart(
            "Line Chart Demo 1",       // chart title
            "Type",                    // domain axis label
            "Value",                   // range axis label
            dataset,                   // data
            PlotOrientation.VERTICAL,  // orientation
            true,                      // include legend
            true,                      // tooltips
            false                      // urls
        );

        chart.setBackgroundPaint(Color.white);

        final CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.setBackgroundPaint(Color.lightGray);
        plot.setRangeGridlinePaint(Color.white);

        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        rangeAxis.setAutoRangeIncludesZero(true);

        return chart;
    }
    
    public void initGUI(){
    	
        chart.setBackgroundPaint(new Color(220,220,220));
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setBackground(Color.lightGray);
        chartPanel.setPreferredSize(new java.awt.Dimension(750, 410));
        frame.setContentPane(chartPanel);
        frame.pack();
        RefineryUtilities.centerFrameOnScreen(frame);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
    	testchart testchart = new testchart();
    }

}

(ja, ich weiß, klassennamen werden groß geschrieben ;))
habs nur auf die schnelle umgebaut, damit man es leichter testen kann.

für jede hilfe wäre ich echt dankbar.
lg
giftie
 
G

Gast

Gast
also irgendwie versteh ich diese methode nicht

public void updateChart(CategoryDataset dataset){
this.createDataset().addChangeListener(this.chart.getCategoryPlot());
dataset.addChangeListener(this.chart.getCategoryPlot());
chart.fireChartChanged();
chartPanel.repaint();
frame.repaint();
}

du übergibst der was, benutzt das aber gar nicht.
in der ersten zeile addest du da nen changelistener auf ein objekt, was danach sowieso verschwindet, oder benutzt du das, was dir da mit this.createDataSet() machst irgendwo?
 
S

SlaterB

Gast
updateChart wird auch mit einem createDataSet() aufgerufen,
das sind dann schon zwei, die zwar auch einen Listener bekommen,
aber sonst nix weiter mit dem Programm zu tun haben,

die angezeigte Chart oder deren DataSet bleibt unberührt

---------

Klassen groß schreiben!!

-------

der Konstruktor

public testchart(final String title) {
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(500, 270));
}


ist ohne Verwendung, doppelter Code?
 

Giftstachel

Bekanntes Mitglied
ja, richtig. ist doppelt, und kann in diesem fall weg, im original wirds gebraucht. habe ich übersehen, beim zusammenstöpseln des codes.

klassennamen groß, ich weiß ebenfalls ein "bastelfehler";)

der chart bleibt unberührt?
ich dachte, das .fireChartChanged(); benutzt den listener automatisch, der auf dem dataset liegt? oder hab ich das falsch verstanden? *grübel*
 
S

SlaterB

Gast
was soll denn bei fireChartChanged() passieren?
die Chart guckt in hier DataSet, welches sich nicht geändert hat,

falls irgendwie ein älterer Zustand bekannt ist, passiert nix,
bestenfalls wird die Chart mit den gleichen Daten neugezeichnet,

> benutzt den listener automatisch

warum sollte irgendwer irgendwo definierte Listener verwenden?
die Chart weiß doch gar nix von deinen anderen DataSets, unabhängig davon, ob der Listener was mit der Sache zu tun hat


wenn man übrigens B bei A als Listener einfügst, dann kennt vielleicht A nun B,
aber B noch längst nicht A


---------

damit irgendwas mal ins Rollen kommt, brauchst du schon entweder
a) chart.verwendeNeuesDataSet(was neues)
oder
b) chart.aktuellesDataSet.aendereDich()

aber irgendwo separate DataSets anzulegen hat offensichtlich auf andere Charts keine Auswirkungen,
fire() hin oder her

edit:
oder richtig, wie du es machst
c) eine neue Chart erstellen,
aber die dann auch richtig anzeigen
 

Giftstachel

Bekanntes Mitglied
jep. das klingt irgendwie logisch^^

allerdings bei dem versuch, den chart mit dem neuen dataset zu füllen, klappt das auch nicht :(

Code:
 public void updateChart(){
       this.chart = createChart(createDataset());
       chart.setTitle("argh");
       chart.fireChartChanged();
       chartPanel.repaint();
       frame.repaint();
    }

das dataset ändert sich jedoch, wie man in der kosole sehen kann.
 
S

SlaterB

Gast
ChartPanel zeigt die Chart an, die ihm im Konstruktor übergeben wurde,

was nützt es, wenn du irgendwo in eine deiner Klassenvariablen ein neue Chart ablegst,
das ist dem ChartPanel egal


immer das gleiche Spiel, nur eine Stufe weiter ;)
 

Giftstachel

Bekanntes Mitglied
oh. man... so simpel..

vielen vielen dank. *froi*

hat eigentlich nur noch this.chartPanel.updateUI(); gefehlt...

da muss man auch erstmal drauf kommen^^

so muss das dann aussehen:
Code:
public void updateChart(){
    	this.chart = createChart(createDataset());
        this.chart.setBackgroundPaint(new Color(220,220,220));
        this.chartPanel.setBackground(Color.lightGray);
        this.chart.fireChartChanged();
        this.chartPanel.setChart(this.chart);
        this.chartPanel.updateUI();
        this.frame.setContentPane(this.chartPanel);
    }



also alles in allem, wenn mal jemand das gleiche prob hat, wie ich:
(kann man sicher noch optimieren, aber fürs erste klappts)

Code:
package ausleser;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

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.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.RefineryUtilities;

public class testchart extends JFrame {

   public testchart(){
          super("mainTable");
          boolean isrunning = true;
          int firstRun = 0;
          
          while (isrunning == true)
           {
             hilfsi++;
              try
               {
                  if (firstRun == 0)
                   {
                     firstRun = 1;
                     this.chartErzeugen();
                     this.initGUI();
                      
                   } 
                  SwingUtilities.invokeLater(new Runnable() {
                     public void run() {
                        testchart.this.updateChart();
                     }
                  });
                   Thread.sleep(2000);
               }
               catch (InterruptedException e)
               {
                   e.getMessage();
               }
               catch (NullPointerException nullpe){}
               catch (ArrayIndexOutOfBoundsException aioobex){}
           }
       }
   
   JFrame frame = new JFrame();
   JFreeChart chart;
   int hilfsi = 0;
   ChartPanel chartPanel = new ChartPanel(chart);
   double []dataSet = new double[50];
   String []typen = new String[50];
   
   
   public double [] daten(){
       int k = 0;
       while(k < 50){
          dataSet[k]= hilfsi + hilfsi/2;
          hilfsi++;
          k++;
       }
       return dataSet;
    }
     
   public String [] typus(){
       int j = 0;
       while(j < 50 ){
          typen[j]=String.valueOf(j);
          j++;
       }
       return typen;
    }

    private CategoryDataset createDataset() {

       final String series1 = "Serie 1";

        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        int i = 0;
        double [] data = this.daten();
        String [] type = this.typus();
        while (i < 50){
           dataset.addValue(data[i], series1, type[i]);
           i++;
        }
        System.out.println("dataset geändert" + data[0] + " typus = " + type[0]);
        return dataset;               
    }
 
    public void chartErzeugen(){
       chart = createChart(createDataset());
    }
   
    public void updateChart(){
    	this.chart = createChart(createDataset());
        this.chart.setBackgroundPaint(new Color(220,220,220));
        this.chartPanel.setBackground(Color.lightGray);
        this.chart.fireChartChanged();
        this.chartPanel.setChart(this.chart);
        this.chartPanel.updateUI();
        this.frame.setContentPane(this.chartPanel);
    }   

    private JFreeChart createChart(final CategoryDataset dataset) {
       final JFreeChart chart = ChartFactory.createLineChart(
            "Line Chart Demo 1",       // chart title
            "Type",                    // domain axis label
            "Value",                   // range axis label
            dataset,                   // data
            PlotOrientation.VERTICAL,  // orientation
            true,                      // include legend
            true,                      // tooltips
            false                      // urls
        );

        chart.setBackgroundPaint(Color.white);

        final CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.setBackgroundPaint(Color.lightGray);
        plot.setRangeGridlinePaint(Color.white);

        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        rangeAxis.setAutoRangeIncludesZero(true);

        return chart;
    }
   
    public void initGUI(){
       
        chart.setBackgroundPaint(new Color(220,220,220));
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setBackground(Color.lightGray);
        chartPanel.setPreferredSize(new java.awt.Dimension(750, 410));
        frame.setContentPane(chartPanel);
        frame.pack();
        RefineryUtilities.centerFrameOnScreen(frame);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
       testchart testchart = new testchart();
    }

}


nicht vergessen, klassennamen IMMER groß schreiben ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
H JFreeChart BarDiagramm Balken der gleichen Serie unterschiedliche Farbe zuordnen AWT, Swing, JavaFX & SWT 2
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H JFreeChart Charts überlagern AWT, Swing, JavaFX & SWT 2
C JFreeChart x-Achse mit absteigenden Werten AWT, Swing, JavaFX & SWT 1
K JFreeChart nicht ohne BarChartDemo startklar? AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
B JFreeChart Gantt Höhe Tasks AWT, Swing, JavaFX & SWT 1
V JFreeChart: Tooltip auf Knopfdruck anzeigen AWT, Swing, JavaFX & SWT 2
V JFreechart: In Linechart Linien einzeichnen und Bereiche färben AWT, Swing, JavaFX & SWT 4
M In JFreeChart Geraden erzeugen AWT, Swing, JavaFX & SWT 11
M JFreechart Zoom out AWT, Swing, JavaFX & SWT 2
M Swing JFreechart X-Achse Tick auslesen AWT, Swing, JavaFX & SWT 13
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
D JFreeChart range der Y Achse verändern. AWT, Swing, JavaFX & SWT 1
G JFreeChart - SetSeriesColor Problem AWT, Swing, JavaFX & SWT 3
K 2D-Grafik JFreeChart plot.setBackgroundImage() AWT, Swing, JavaFX & SWT 1
K 2D-Grafik JFreeChart DateAxis AWT, Swing, JavaFX & SWT 9
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
M JFreeChart in ein File schreiben (bzw. JFrame in ein File Schreiben) AWT, Swing, JavaFX & SWT 2
A JFreeChart in GUI AWT, Swing, JavaFX & SWT 3
E JFreeChart: Timeseries-Chart und Area-Chart "überlappen" lassen AWT, Swing, JavaFX & SWT 6
B JFreeChart-Erweiterungen AWT, Swing, JavaFX & SWT 4
E JFreeChart in einer dynamischen Aufzeichnung neue Serien hinzufügen? AWT, Swing, JavaFX & SWT 7
I XML - JFreeChart AWT, Swing, JavaFX & SWT 15
N Dynamische JFreechart updated UI nicht AWT, Swing, JavaFX & SWT 5
S JFreeChart - Schriftgröße der Legende AWT, Swing, JavaFX & SWT 2
O Swing JFreechart subtitle formatieren AWT, Swing, JavaFX & SWT 3
N JFreeChart: Plot soll mit skalieren AWT, Swing, JavaFX & SWT 5
R JFreeChart Plots AWT, Swing, JavaFX & SWT 6
J JFreechart spezielles Balkendiagramm AWT, Swing, JavaFX & SWT 2
R JFreeChart: nur jeden n-ten Wert auf der X-Achse anzeigen AWT, Swing, JavaFX & SWT 5
R JFreeChart aktualisieren wenn sich die Ausgangsdaten ändern AWT, Swing, JavaFX & SWT 8
T JFreeChart Linine einzeichnen AWT, Swing, JavaFX & SWT 2
M JFreeChart Ausrichtung der Balken AWT, Swing, JavaFX & SWT 2
R jFreeChart in eine NetBeans Projekt integrieren AWT, Swing, JavaFX & SWT 24
D JFreeChart Breite (width) ändern AWT, Swing, JavaFX & SWT 6
A Swing JFreeChart, Gantt, Schichtplan AWT, Swing, JavaFX & SWT 3
R JFreeChart Skalierung zur Laufzeit ändern AWT, Swing, JavaFX & SWT 7
F Wie lade ich eine CategoryDataset aus XML ins JFreeChart? AWT, Swing, JavaFX & SWT 9
J JFreeChart - mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
A JFreeChart: 2 X-Achsen für ein Dataset AWT, Swing, JavaFX & SWT 2
T JFreeChart export Problem AWT, Swing, JavaFX & SWT 4
S JFreeChart Achse immer sichtbar AWT, Swing, JavaFX & SWT 2
D JFreechart maximalangezeigter Wertebereich AWT, Swing, JavaFX & SWT 3
B AWT [JFreeChart] malt nicht so wie ich will :-( AWT, Swing, JavaFX & SWT 2
B JFreeChart Balkendiagramm ActionEvent AWT, Swing, JavaFX & SWT 2
L Labels sichtbar - JFreeChart AWT, Swing, JavaFX & SWT 5
A Schachbrettartiges Diagramm mit JFreeChart AWT, Swing, JavaFX & SWT 4
E JFreeChart AWT, Swing, JavaFX & SWT 2
L Gantt Chart - JFreeChart AWT, Swing, JavaFX & SWT 5
K JFreeChart im JScrollPane ausblenden AWT, Swing, JavaFX & SWT 2
L JFreeChart Labelrotation AWT, Swing, JavaFX & SWT 2
L JFreeChart Farbe von Balken AWT, Swing, JavaFX & SWT 5
L JFreeChart Balkenanordnung AWT, Swing, JavaFX & SWT 10
L JFreeChart Achsenskalierung AWT, Swing, JavaFX & SWT 4
L JFreeChart - Dataset befüllen AWT, Swing, JavaFX & SWT 2
L JFreeChart - Line Shapes AWT, Swing, JavaFX & SWT 15
N JFreeChart - Basics AWT, Swing, JavaFX & SWT 2
L NullPointerException JFreeChart AWT, Swing, JavaFX & SWT 10
L JFreeChart - Legende vertikal AWT, Swing, JavaFX & SWT 5
L JFreeChart - Linienstärke einstellen AWT, Swing, JavaFX & SWT 2
L JFreeChart Einstellungen AWT, Swing, JavaFX & SWT 22
L JFreeChart - Gitterfarbe schwarz AWT, Swing, JavaFX & SWT 4
L JFreeChart StackedBar + Line-Chart kombinieren AWT, Swing, JavaFX & SWT 4
L JFreeChart - Performance bei PNG-Erstellung AWT, Swing, JavaFX & SWT 5
L JFreeChart - Legende beliebig positionieren AWT, Swing, JavaFX & SWT 16
G JFreechart Balken einfärben AWT, Swing, JavaFX & SWT 6
F Probleme mit NumberAxis bei JFreeChart AWT, Swing, JavaFX & SWT 5
G jfreechart (Diagramm speichern mit ein vorgegebenen Namen) AWT, Swing, JavaFX & SWT 6
S JFreeChart neu zeichnen sich das Datenset geändert hat. AWT, Swing, JavaFX & SWT 4
K JFreeChart Eigentschaften des Charts ändern AWT, Swing, JavaFX & SWT 8
G Ausser Jfreechart, Chart Programme? AWT, Swing, JavaFX & SWT 11
S Dimensionen JFreeChart AWT, Swing, JavaFX & SWT 5
S JFreeChart Stufendiagramm AWT, Swing, JavaFX & SWT 2
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
K JFreeChart: Platz zwischen Balken AWT, Swing, JavaFX & SWT 3
M JFreeChart Handbuch? AWT, Swing, JavaFX & SWT 8
P JFreeChart - TimeSeriesDiagram AWT, Swing, JavaFX & SWT 2
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
N JavaFX TextArea Updaten bevor Prozess gestartet wird AWT, Swing, JavaFX & SWT 7
I JavaFX Im Controller die ProgressBar mit Task updaten AWT, Swing, JavaFX & SWT 6
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
A Swing JMenuBar updaten AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
S Swing Oberfläche rekusiv updaten mit updateUi() AWT, Swing, JavaFX & SWT 10
N JTable updaten AWT, Swing, JavaFX & SWT 2
M GUI muss updaten und neuzeichnen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben