# Progressbar



## PollerJava (11. Okt 2007)

Hallo nochmal,

ich habe einen Progressbar und habe eine Zeit, z.B.: 5sec und jetzt möchte ich diese 5sec kuntionierlich auf dem JProgressbar darstellen,
Ist das irgendwie möglich bzw. wie kann man das Resourcensparend machen?

Vielen Dank
lg


----------



## JPKI (11. Okt 2007)

Ich denke, dass 5000 Zwischenschritte ausreichend sind, um die Bewegung als "kontinuierlich" darzustellen.

```
for (int i = 0; i < 5000; i++)
 bar.setValue(i);
```
Edit: Vorher natürlich die Progressbar mit dem Maximalwert 5000 initialisieren :wink:


----------



## PollerJava (11. Okt 2007)

naja, die Zeit errechne ich mir, die ist nicht immer 5s, kann auch 13s, 49s usw. sein und ich möchte dass die JProgressBar eben immer genau so lange braucht, bis der Balken voll ist (eben einmal 5s, dann 13, 49 usw.)

Muss ich da einen scheduler machender den JProgressBar alle 500ms erhöht oder wie kann ich das machen.

Ich möchte dem JProgressbar einfach sagen, Du hast 5sec/13s/49s (je nach meinen Berechnungen) zeit um die kontinuierlich zu füllen,


----------



## tuxedo (11. Okt 2007)

Geht man von 50fps aus (25 würden theoretisch auch reichen, aber "mehr" sieht einfach flüssiger aus), so würden sich 250 Schritte zu je 20 Millisekunden ergeben. 5000 Schritte wären 1000fps... braucht man wirklich so viel? Kann ich mir noch vorstellen. Müsste man mal ausprobieren.

- Alex


----------



## PollerJava (11. Okt 2007)

und wie realisiere ich das, mit einem Timer oder was ist am Resourcensparsamsten?


----------



## tuxedo (11. Okt 2007)

Ich hab mal schnell was zusammengeklickt ... 


```
import java.awt.BorderLayout;
import java.awt.GridBagLayout;

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import java.awt.Dimension;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.Insets;

public class Progressbar extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JProgressBar jProgressBar = null;
	private JButton jButton = null;

	/**
	 * This is the default constructor
	 */
	public Progressbar() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
		
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); // Generated
			gridBagConstraints1.gridx = 0;  // Generated
			gridBagConstraints1.ipady = 0;  // Generated
			gridBagConstraints1.gridy = 0;  // Generated
			GridBagConstraints gridBagConstraints = new GridBagConstraints(); // Generated
			gridBagConstraints.gridx = 0;  // Generated
			gridBagConstraints.insets = new Insets(15, 0, 0, 0);  // Generated
			gridBagConstraints.gridy = 1;  // Generated
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(getJButton(), gridBagConstraints);  // Generated
			jContentPane.add(getJProgressBar(), gridBagConstraints1);  // Generated
		
		}
		return jContentPane;
	}

	/**
	 * This method initializes jProgressBar	
	 * 	
	 * @return javax.swing.JProgressBar	
	 */
	private JProgressBar getJProgressBar() {
		if (jProgressBar == null) {
			jProgressBar = new JProgressBar();
			jProgressBar.setPreferredSize(new Dimension(200, 14));  // Generated
			jProgressBar.setMaximum(250);  // Generated
			jProgressBar.setMaximumSize(new Dimension(200, 14));  // Generated
		}
		return jProgressBar;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("Start");  // Generated
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
				
					new Thread(){
						
						@Override
						public void run() {
							
							int time = 5; // Dauer
							int fps = 25; // Anzahl der "Frames per second"
							
							int sleeptime = 1000/fps; 
							
							System.out.println("sleeptime "+sleeptime);
							System.out.println("fps "+fps);
							System.out.println("steps "+(time*fps));
							System.out.println("totaltime "+(time*fps)*sleeptime);
							
							jProgressBar.setMaximum((time*fps));  // berechnetes schrittmaximum einstellen
							
							for(int i=0;i<(time*fps)+1;i++){
								
								getJProgressBar().setValue(i);
								getJProgressBar().repaint(); // ein update erzwingen, sonst ruckelt's auch mit hohen fps
					
								try {
									
									Thread.sleep(sleeptime);
									
								} catch (InterruptedException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
							}
						}
						
					}.start();
					
					
				}
						
					
					
				
			});
		}
		return jButton;
	}
	
	public static void main(String[] args) {
		new Progressbar();
	}

}
```

Ist recht "quick'n'dirty" ... Wenn du mit der fps hoch gehst, muss die gui häufige aktualisiert werden. D.h. je niedriger die FPS desto weniger "stress". 

Bei mir läufts mit 25fps noch bestens.


----------



## JPKI (11. Okt 2007)

Kleine Verbesserung meines Codes, wenn du nach einer variablen Anzahl von Sekunden gehen möchtest:


```
public static void startProgressbar(JProgressBar bar, int durationInMilliSeconds) {

bar.setMaximum(5000);

if (durationInMilliSeconds < 5000)
 durationInMilliSeconds = 5000;
int subDuration = (int)durationInMilliSeconds/5000;

for (int i = 0; i < 5000; i++) {

 bar.setValue(i);
 try { Thread.sleep(subDuration); } catch (InterruptedException ex) {}
}
}
```

Code ohne Gewähr :wink:


----------



## PollerJava (11. Okt 2007)

Vielen Dank, !!!!


----------



## PollerJava (11. Okt 2007)

Hallo nochmal,

ich hab jetzt meinen Progressbar implementiert, 
Funktioniert so weit so gut, ein Problem habe ich allerdings noch und zwar, wenn ich sehr viele Daten aus meiner DB lade, dann schätz ich mal ist das Programm so beschäftigt, dass mein ProgressBar nur ca zur Mitte hüpft und ganz ans ende aber nicht kontinuierlich nach oben geht,
Kann ich da was machen, Das ganze hochzählen ist eh in einem eigenen Thread und repaint wird auch nach jedem durchlauf aufgerufen,
Ist das der GUI zu steil oder kann ich da was machen?

Vielen Dank für die Antworten,

lg






```
public void verstaendigen(final CheckBoxSubject subject, final String listName, final int xSeite, final trend trend, final int werteAnzahl)
		{
                trend.getProgressBar(xSeite).setValue(100000);               
                new Thread()
                    {                  
                    @Override public void run()                        
                        {
                        float time = (float)(((float)(werteAnzahl*zeitAuslesen)/anzahlAuslesen)/1000) + (float)0.5;                                                 // berechnete Dauer in Sekunden
                        int fps = 50;                                                                                                           // Anzahl der "Frames per second"                  
                        int sleeptime = 1000/fps;                     
                        trend.getProgressBar(xSeite).setMaximum(((int)(time*fps)));                                                         // berechnetes schrittmaximum einstellen                     
                        for(int i = 0; i < (time*fps)+1; i++)
                            {                       
                            trend.getProgressBar(xSeite).setValue(i);
                            trend.getProgressBar(xSeite).repaint();             
                            try 
                                {                           
                                Thread.sleep(sleeptime);                           
                                } 
                            catch (InterruptedException e1) 
                                {
                                e1.printStackTrace();
                                } 
                            }
                        }                  
                    }.start();               
                }
```


----------



## tuxedo (11. Okt 2007)

Schau doch mal mit dem TaskManager oder "jconsole" nach der CPU-Last... Dann weißt du ob's am "stressigen" auslesen und zusammenbauen der Daten liegt. 

Mal was anderes: Was machst du wenn das Auslesen vor der Progressbar fertig ist? Wird der User dann gezwungen zu warten?

ich würde im übrigen keine voll laufende Progressbar nehmen. ich würde stattdessen die "Knight-Rider" Variante (hin und her laufendes Klötzchen) nehmen und darunter die geschätzte Zeit in nem JLabel oder sowas runterzählen lassen. Und den Dialog halt dann abbrechen wenn die DB-Operation fertig ist. Und wenn das sich hin und herbewegende Klötzchen manchmal ins Stocken gerät ist das für den User doch ein zeichen dass die Kiste noch arbeitet. So hat er eine visuelle Rückkopplung dass sich die DB-Operation nicht erhängt hat und nur fleissig die Progressbar möglichst exakt gleich schnell aktualisiert.

Die voll laufenden Progressbar vermittelt eher die Vorstellung dass zwischen der Progressbar und der Datenbankoperation ein absolut direkter Zusammenhang besteht. Und das ist ja nicht der Fall. Geschickter ist es wenn der User erahnen kann ob und was sich im Hintergrund tut.

- Alex


----------



## PollerJava (11. Okt 2007)

naja, wo meine Bar zum Stocken kommt, habe ich eine CPU- Auslastung von ca. 40%, wenn die Bar flüssig läuft, habe ich eine CPU- Auslastung von 5%,

Es hängt also davon ab,  wieviel Daten ich aus der DB heraushole,

Das ist jetzt ganz schlecht für mich, denn ich würde genau dann, wenn ich viele Daten heraushole, die Bar benötigen,


Zu Deinem Vorschlag: würd ich auch besser finden, aber das sollte meiner Meinung nach auch "flüssig" laufen,


Nützt es was, wenn ich die Priorität des Threads ober hochschraube (bzw. Priorität hoch , Zahl runter)?


lg


----------



## tuxedo (11. Okt 2007)

Bzgl. der Prio:
Probiers aus. Da ich nebenher ja keine Auslastung in meinem Test habe kann ich's nicht ohne weiteres testen. 

Und wie gesagt: Wenn's bei dem Knight-Rider-Effekt "ruckelt", weiß ich als User dass die Anwendung noch arbeitet.

Ich hasse es nämlich wenn ich eine Anwendung habe deren "Anwendung arbeitet noch" Anzeige kontinuierich mit derselben Geschwindigkeit läuft und so kein Feedback gibt, ob das System im Hintergrund überhaupt noch läuft und nur noch die Anzeige "alles bestens" vorgaukelt...

- Alex


----------



## PollerJava (11. Okt 2007)

Das sehe ich auch so, nur ich mach momentan noch "Sie wünschen, ich spiele", das hab ich mir nicht ausgedacht.

Vielen Dank aber für Deine Anregungen, ich werds bei Gelegenheit mal einbringen,


Da muss ich bei deinem Code aber dann eine eigenen run()- Methode machen, damit ich die Priority setzten kann oder?

lg


----------



## tuxedo (11. Okt 2007)

Nö, ne eigene run() hast du ja schon...Du musst das Thread-Objekt nur halt "echt" und nicht anonym machen.

Also sowas:


```
Thread t = new Thread(){
....run-methode und anderer kram...
};
t.start();
```

Weil so kommst du dann, wenn du die Progressbar doch vorzeitig abbrechen willst weil die Db-Operation vllt doch schon fertig ist, mit einem


```
t.interrupt()
```

wieder dran um das dem ganzen "ein Ende" zu bereiten ;-)

Und mit 


```
t.setPriority(x)
```

kannst du vor dem start noch die Prio setzen. 

- Alex


----------



## PollerJava (11. Okt 2007)

Nö, hilft leider gar nichts, liegt an der GUI, die macht wahrscheinlich kein repaint() oder das Aktualisieren sieht man halt nicht bei so einer CPU- Auslastung, 
Gibts da noch irgendeine Möglichkeit, kann ich dem dem repaint() irgendetwas mitteilen (zeichne sofort oder so),
Ich dachte mir immer, was in einem eigenen Thread läuft, das ist fast vollkommen unabhängig vom anderen, Ist es irgendwie möglich, den Progressbar auf meinem JPanel zu separieren (in einem eigenen Thread oder so) damits dann das ganze Anzeigen unabhängig vom Auslesen ist?

lg




```
Thread t = new Thread("ProgressBar")
                    {                  
                    @Override public void run()                        
                        {
                        time += (float)(((float)(werteAnzahl*zeitAuslesen)/anzahlAuslesen)/1000) + (float)0.5;                                                  // berechnete Dauer in Sekunden
                        int fps = 50;                                                                                                                           // Anzahl der "Frames per second"                  
                        int sleeptime = 1000/fps;                     
                        trend.getProgressBar(xSeite).setMaximum(((int)(time*fps)));                                                                         // berechnetes schrittmaximum einstellen                     
                        for(int i = 0; i < (time*fps)+1; i++)
                            {  
                            trend.getProgressBar(xSeite).setValue(i);
                            trend.getProgressBar(xSeite).repaint();             
                            try 
                                {                           
                                Thread.sleep(sleeptime);                           
                                } 
                            catch (InterruptedException e1) 
                                {
                                e1.printStackTrace();
                                } 
                            }
                        time = 0;
                        }                  
                    };
                t.setPriority(1);
                t.start();
```


----------



## tuxedo (11. Okt 2007)

Naja, du hast noch den EDT, den Dispatcher in Swing... Mit repaint kannst du dem nur sagen: "Bitte bitte nimm mich als allernächstes dran, möglichst gleich"... 

Wie man eine Swing-Komponente im EDT jetzt bevorzugt.. Gute Frage. Wobei ja nicht die innereien des EDT dran schuld sein dürften.. Weil die DB-Operation ist ja unabhängig von der GUI und somit auch vom EDT. Was heissen würde dass der EDT selbst eine zu niedrige Prio hat... Hmm.


----------



## PollerJava (11. Okt 2007)

Oje, hab gegooglet aber mit dem EDT kann ich gar nichts anfangen, dem kann man ja auch garn nichts sagen, das ist jha ein Teil im Hintergrund,
Wie macht das Windows eigentlich, dass der Balken noch rumfetzt obwohl die Mühle steht ?
Mehr als einen eigenen Process können die dem Teil auch nicht geben, oder?


Naja zu der Unabhängigkeit: es müssen ja die ganzen Daten auf das JFreeCart gezeichnet werden und das benötigt so seine Zeit, habe ich schon festgestellt,
Da werd ich eben das Problem haben mit dem FreeCahrt,
Ich müsste also den JFreechart von dem JProgressBar irgendwie unabhängig machen,

Ist das irgendwie möglich?

lg


----------



## PollerJava (12. Okt 2007)

Könnte mir das was helfen

http://java.sun.com/developer/technicalArticles/javase/swingworker/#Swing

Vielleicht klappts mit einem SwingWorker, ist das möglich?

lg


----------



## tuxedo (12. Okt 2007)

Wieso probierst du's nicht aus? Frei nach dem Motto "Learning by doing" ...


----------



## PollerJava (12. Okt 2007)

Ja aber ich komm mit dem SwingWorker nicht zurecht,
Ich weiß nicht was ich da in den SwingWorker packen muss bzw in die doBackground- Methode, die doBackground - Methode retuniert mir da irgendwas und in der Methode done() kann ich dann das Ergebnis verwerden (doBackground und done sollten ja nicht von mir aufgerufen werden,

Meine ProgressBar unten sollt eben unabhängig von der GUI laufen, damit eben die JProgressBar nicht blockiert, wenn der EDT was anderes macht.


Hier ist meine Methode,
Vielleicht hat jemandc eine Tipp für mich,
Vielen Dank,

lg



```
public class MyProgressBar extends SwingWorker<Void, Void>
    {   
    private DBReader dbReader;
    private float zeitAuslesen = (float)347;
    private int anzahlAuslesen = 28890;
    private static float time;
    
    public MyrogressBar(DBReader dbReader)
        {
        this.dbReader = dbReader;
        dbReader.attach(new CheckBoxObserver()
	    { 
            public void verstaendigen(final CheckBoxSubject subject, final String listName, final int xSeite, final trend trend, final int werteAnzahl)
		{
                trend.getProgressBar(xSeite).setValue(100000);               
                Thread t = new Thread("ProgressBar")
                    {                  
                    @Override public void run()                        
                        {
                        time += (float)(((float)(werteAnzahl*zeitAuslesen)/anzahlAuslesen)/1000) + (float)0.5;                                                  // berechnete Dauer in Sekunden
                        int fps = 50;                                                                                                                                             
                        int sleeptime = 1000/fps;                     
                        trend.getProgressBar(xSeite).setMaximum(((int)(time*fps)));                                                                         // berechnetes schrittmaximum einstellen                     
                        for(int i = 0; i < (time*fps)+1; i++)
                            {  
                            trend.getProgressBar(xSeite).setValue(i);
                            trend.getProgressBar(xSeite).repaint();             
                            try 
                                {                           
                                Thread.sleep(sleeptime);                           
                                } 
                            catch (InterruptedException e1) 
                                {
                                e1.printStackTrace();
                                } 
                            }
                        time = 0;
                        }                  
                    };
                t.setPriority(1);
                t.start();               
                } 
            });
        }

    protected Void doInBackground() throws Exception 
        {
        }
    }
```


----------



## tuxedo (12. Okt 2007)

Hier wird das Thema ganz nett und anschaulich erklärt (Präsentation mit Audio):

http://www.javalobby.org/eps/galbraith-swing-2/  -> etwa um Slide 15 

Solltest dir aber am besten die ganze Präsentation ansehen. Ist echt klasse ..

- Alex


----------



## PollerJava (12. Okt 2007)

Mir ist ja nicht einmal klar, was ich in meinem Fall mit dem Swingworker erledigen soll, das Auslesen aus der DB und da Anzeigen auf dem JFreeCart oder den JProgressBar,
AM liebsten wäre mir natürlich die JProgressBar, denn das Auslesen aus der DB und das Anzeigen auf dem JFreeChart ist ja ziemlich umfangreich,


----------



## tuxedo (12. Okt 2007)

Ich hab mir die Präsentation eben nochmal selbst angesehen.

SwingWorker und Co. sind dazu da arbeitsintensive Dinge von der GUI zu entkoppeln, damit die GUI weiterhin möglichst flüssig aktiv bleibt und noch auf Benutzereingaben etc. reagieren kann.

Ergo müsstest du deine DB-Aktion und alles was damit zusammenhängt und CPU braucht, auslagern. 

Lagerst du aber stattdessen die ProgressBar aus, hast du immer noch das Problem dass der EDT nicht mit dem neuzeichnen hinterher kommt weil die DB-Aktionen etc. den EDT ausbremsen. 

Schau dir am besten die ganze Präsentation an, dann verstehst du was ich meine. Der Typ erklärt das echt gut.

- Alex


----------



## PollerJava (12. Okt 2007)

JA das hab ich soweit verstanden, 
bei mir ist das Arbeitsintensive das Zeichnen der Linien auf dem JFreechart, dass kann je nach Menge der Daten auch mal 6sec dauern,

Mir ist aber nicht klar, was ich da dagegen machen kann, da ja der JFreeChart auf ein JFreeChart, also auf ein Panel bzw. auf die GUI zeichnet und meine JProgressBar sich ja auch auf der GUI befindet und auch aktualisiert werden soll,

Das Auslesen aus der DB dauert ja nicht unbedingt so lange,


----------



## tuxedo (12. Okt 2007)

Ach so, hauptverursacher ist die GUI selbst....

Hmm. Das ist ein "Problem". In der Präsentation wurde ja erklärt dass der EDT der für's neuzeichnen zuständig ist, nur mit einem einzigen Thread arbeitet. 

Sehe als Ausweg aktuell nur das optinieren deines JFreeCharts.

Wie füllst du denn da die Daten rein?


----------



## PollerJava (12. Okt 2007)

Hab das auslesen aus der DB und das Zeichnen auf dem JFreeChart in einen SwingWorker gegeben und dieser macht seine Sache ganz gut, es funktioniert schon ziemlich gut, ab und zu stockt die JProgressBar noch aber das finde ich ok.

Jetzt möchte ich noch mein altes Problem aufgreifen:

Wenn ich auf dem JFreeChart- Panel einige Linien anzeige und dann auf meiner Toolbar  auf eine JButton fahre (mit der Maus) um ein JPanel auszufahren, dann dauer das noch ziemlich lange, bis das JPanel ausfährt, 
Ich weiß aber nicht wirkich, was da so lange benötigt, Wenn ich mit der Maus auf den Jbutton fahre, dann wird das sofort dedektiert, nur das ausfahren lässt dann auf sich warten,

Hast Du/Ihr da eine Idee, an was das liegen kann?

lg


----------



## tuxedo (12. Okt 2007)

Wie "fährst du denn aus" ?

Kann mir da gerade nix drunter vorstellen.

- Alex


----------



## PollerJava (12. Okt 2007)

Mit mouseEntered(), wenn die Maus über den Button ist, dann "fährt" das JPanel aus:

http://www.java-forum.org/de/userfiles/user9898/visu.png

Wenn ich dann einige Linien auf dem JFreeChart habe, dann braucht es eine gewisse zeit, bis das JPanel ausfährt,

Keine Ahnung was da so lange braucht, das die Maus über dem JButton (z.B.: Kraftwerte) wird sofort dedektiert aber das Ausfahren braucht halt seine Zeit,
 Hast Du da eine Ahnung, warum das so ist,


----------



## tuxedo (12. Okt 2007)

Naja, wenn etwas "fährt" bewegt es sich. Und wenn sich etwas "bewegt" ist das mit einem Screenshot nicht gut erklärt.

Hast du das "ausfahren", sprich die Bewegung selbst implementiert oder nutzt du da irgendwelche Libs? Wie sieht der entsprechende Code dazu aus?

- Alex


----------



## PollerJava (12. Okt 2007)

ausklappen währe vielleicht ein treffenderer Begriff:

Auf der ToolBar ist der JButton, wenn man auf diesen JButton mit der Maus ist, dann klappt sich "s" aus, uns das dauert eben bei vielen Linien, 


Hier der Code:


```
private JScrollPane s;  



s = new JScrollPane();
s.setPreferredSize(new Dimension(Control.getStatesElementAt(0).getJtreewidth(), 0));
s.setViewportView(tree);   
s.addMouseListener(this);

if (ueberlappend == true) 
           {getLayeredPane().add(s, JLayeredPane.POPUP_LAYER);
            s.setBounds(28, 0, 200, getSize().height+300);}
        else {mainPanel.add(s, BorderLayout.WEST);}  


btPanel = new JToolBar(name, JToolBar.VERTICAL);
btTree = new JButton();
btPanel.add(btTree);


btTree.addMouseListener(this);

public void mouseEntered(final MouseEvent e) 
        {
        Object source = e.getSource();
        if(source == btTree) {
            s.setVisible(true);
            s.setBounds(28, 0, Control.getStatesElementAt(0).getJtreewidth(), getSize().height-30);
            validate();
            }
        }
```


----------



## tuxedo (12. Okt 2007)

Probier mal da noch ein repaint() nach dem validate() ...

- Alex


----------



## PollerJava (12. Okt 2007)

Nö, is das Gleiche,

Ich vermute mal folgendes:

JFreeChart hat ja auch ein piant() implementiert und wenn sich auf dem JFreeChart- Panel etwas ändert, dann wird diese ja aufgerufen, und diese paint()- Methode vom JFreeChart blockiert mir die ganze GUI- Queue und deshalb dauert es so lange, die CPU- auslastung gehtr ja auch auf 50% wenn ich auf den Jbutton fahre,

Keine Ahung, ob ich das unterbinden kann,

Weiß Du da was?

lg


----------



## tuxedo (12. Okt 2007)

Hmm, hört sich logisch an. Womit wir aber wieder beim Thema wären JFreeChart optimieren. 

Gibts kein JFreeChart Forum wo du mal die Spezialisten fragen kannst?

- Alex


----------



## PollerJava (12. Okt 2007)

Doch, aber es gibt in dem Forum nur einen Spezialisten (der Projektleiter des ganzen), Die Chance auf eine Antwort ist sehr gering,


----------



## tuxedo (12. Okt 2007)

Fragen kostet nix. Und dort werden mehr Leute rumspringen die sich mit JFreeChart beschäftigen als hier.

Nutzt du Java 5 oder 6 ?

- Alex


----------



## PollerJava (12. Okt 2007)

Java 6!!!

ich müsste halt irgendwie an die paint- Methode von JFreeChart herannkommen um diese dann wieder in einen SwingWorker zu geben,


----------



## tuxedo (12. Okt 2007)

Um mal weiter ins Detail zu gehen. WIE zeichnest du dein Chart?

Benutzt du ein Buffered Image? Benutzt du Graphics2D? Lass mal n bisschen Code sehen.

- Alex


----------



## PollerJava (15. Okt 2007)

Hallo,

ich habs bis jetzt so gemacht, wie es auch in den Beispielen von JFreeChart gemacht wird und zwar wie unten,
Keine Ahnung, wo ich da ein Buffered Image oder ein Graphics2D anwenden kann?

lg und vielen Dank,



```
XYDataset dataset = createDataset(nameLinie, sec1, dBWerte, trendCnt, xSeite); 
plot[xSeite].setDataset(trendCnt, dataset); 




private XYDataset createDataset(final String name, RegularTimePeriod start, List<DBWertReadBean> dBWerte, final int trendCnt, final int xSeite)                                 // erstellt das dataset
        {
        series[xSeite][trendCnt] = null;
        series[xSeite][trendCnt] = new TimeSeries(name, start.getClass());                     
        for(DBWertReadBean liste : dBWerte)                            
            {          
            dateTime dateTime = new dateTime(); 
            dateTime.setDateTime(liste.getZeitstempel().toString());
            Second sec = new Second(dateTime.getSecond(),dateTime.getMinute(), dateTime.getHour(), dateTime.getDay(), dateTime.getMonth(), dateTime.getYear());
            series[xSeite][trendCnt].add(sec, liste.getWert());     
            dateTime = null;
            sec = null;
                          
            }  
        dataset = new TimeSeriesCollection();   
        dataset.addSeries(series[xSeite][trendCnt]); 
        return dataset;
        }
```


----------



## tuxedo (15. Okt 2007)

Vermeide möglichst "= new ..." in einer Schleife. Das braucht unnötig viel Zeit (wg. Speicherallokieren etc..). Vorallem wenn deine Schleife sehr viele Durchläufe hat.

- Alex


----------



## PollerJava (15. Okt 2007)

Ich habe aber keine Ahnung, wie ich das anders machen könntem
ich muss ja für jeden Wert bei jeden durchlauf die Zeit und den Wert eben setzen,
Hast du da einen anderen Vorschlag, wie ich das Besser machen kann?

lg




```
for(DBWertReadBean liste : dBWerte)                           
            {         
            dateTime dateTime = new dateTime();
            dateTime.setDateTime(liste.getZeitstempel().toString());
            Second sec = new Second(dateTime.getSecond(),dateTime.getMinute(), dateTime.getHour(), dateTime.getDay(), dateTime.getMonth(), dateTime.getYear());
            series[xSeite][trendCnt].add(sec, liste.getWert());     
            dateTime = null;
            sec = null;
                         
            }
```


----------



## tuxedo (15. Okt 2007)

Du kannst das ganze doch schon direkt nach dem auslesen aus der DB tun. Dann wären die ganzen Daten, die du bis jetzt in der Schleife extrahierst und in neue Objekte steckst, schon im listen-Objekt drin und müssten nicht jedesmal neu aufbereitet werden. 

Ist halt auch noch die Frage wo diese Schleife sitzt und ob das Zeichnen von dem Durchlaufen der Liste abhängt.

- Alex


----------

