auf fertigstellung reagieren

MScalli

Erfahrenes Mitglied
Hi leutz.

Ich erstelle mittels JasperReports einen Report(z.B. PDF oder RTF usw.)
jetzt will ich einen Ladebalken anzeigen und diesen beenden wenn ddie Datei fertig ist.

weiss jemand ne lösung evtl gibts da schon was in JasperReports.. leider finde ich da nichts.

wollte auch ´schon darauf reagieren ob die Datei die erstellten werden soll vorhanden ist.. leider wird z.B. die RTF SOFORT erstellt und dann gefüllt.

plz help!! finde hier echt keine Lösung!!

gruss
MScalli
 
Das was Du machen willst ist wirklich nicht einfach, da Du die Gesamtdauer nicht kennst, die JasperReports braucht, um das PDF zu erstellen und Du somit auch nicht den Fortschritt darstellen kannst.

Übrigends entdeckst Du dieses Problem auch bei namenhaften Dateimanagern, die oft von "noch 3min" wieder auf "noch 5min" beim Dateikopieren springen. Das liegt daran, daß man intern nur "Erfahrungswerte" für die Dauer einer bestimmten Aktion annehmen kann, denn nur zum Schluß weiß man, wie lange es wirklich gedauert hat.

Einen Workaround hätte ich für Dich:
1. beim Testen verschiedener PDFs eine durchschnittliche Dauer pro Seite oder Bytes als "Erfahrungswert" hinterlegen oder anhand dessen berechnen lassen
2. ggf. diese "Erfahrungswerte" mit jeder reellen PDF-Erstellung-Dauer "verfeinern", somit werden diese immer "genauer"

oder:

Nur eine "Eieruhr" anzeigen.
 
Ja ok.. die genaue Dauer wäre mir ziemlich egal..
Mir würde ja gif reichen das nur anzeigt "Bitte Warten PDF wird erstellt"
Wenn das PDF dann komplett fertig ist will ich das PDF einblenden und das gif ausblenden.

d.h. ich müsste nur wissen ob das PDF schon fertig gestellt worden ist..
oder ob es noch im zugriff ist.
Nur wie mache ich das
 
hmm, kannst du nicht die größe des files prüfen und sobald sich länger als 2 sek nix an der größe getan hat gehst du davon aus das der prozess beendet ist...

in der Zeit kannst du einen Laufbalken anzeigen, der immer von rechts nach links slided...
Das gibts sogar als Standard in Java.

Chriz
 
Du kannst Dein PDF auch mit einem Stream erzeugen, den Du JasperReports übergibst. Mittels dem FileChannel überwachst Du dann, ob JasperReports noch schreibt (siehe auch mein Beispiel):

Code:
public class Main implements Runnable {
 
 
  private static final String FILE = "d:\\TEMP\\test.txt";
 
 
  private FileChannel fc;
 
 
  private Main(FileChannel fc) {
    this.fc = fc;
  }
 
 
  public void run() {
    while (fc.isOpen()) {
      System.out.print('.');
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println();
    System.out.println("fertig");
  }
 
 
  public static void main(String[] args) throws IOException {
    FileOutputStream out = new FileOutputStream(FILE);
    long end = System.currentTimeMillis() + 5000;
    Thread t = new Thread(new Main(out.getChannel()));
    t.start();
    while (end > System.currentTimeMillis()) {
      out.write((byte) System.currentTimeMillis());
      try {
        Thread.sleep(10);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    out.flush();
    out.close();
  }
 
}

Du würdest das dann etwa so einbauen:
Code:
FileOutputStream myStream = new FileOutputStream("webnobis.pdf");
FileChannel fc = myStream.getChannel();
// fc ---> entsprechend obrigem Beispiel auswerten
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME, filledReportFileName);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, myStream);
exporter.setParameter(JRPdfExporterParameter.IS_COMPRESSED, Boolean.TRUE);
exporter.exportReport();
 
Ich habs jetzt so probiert das ich nen einzelnen Thread für die JProgressBar nehme..
dann in einem anderen Thread alle 2 Sekunden schaue ob sich die grösse der PDF verändert hat..
und in dem Programm läuft JasperReports einfach weiter und erzeugt die PDF..

leider habe ich das Problem das die JProgressBar zwar angezeigt wird aber wie eingefroren aussieht. Erst wenn die PDF fertig erzeugt ist fängt der Balken an sich zu bewegen..
Braucht da JasperReports zuviel Power oder mache ich einfach was falsch?

Kann mir mal bitte wer helfen denn Ich habe noch nicht so oft mit Threads gearbeitet.
 
Ich habe deine Idee mit der Grösse des Files überprüfen mal übernommen.
Habe leider das Problem das die ProgressBar nicht läuft solange JasperReports das PDF erstellt. Obwohl es ein eigener Thred ist.
Hier mal mein ansatz..

Code:
//Thread der alle 2 Sekunden überprüft ob die grösse der Datei sich verändert hat
Runnable runnable = new Runnable() {
			    public void run() {
			    				    	
			    	float filesize = MyFile.getFileSize(path + "\\" + name);
			      while (filesize != MyFile.getFileSize(path + "\\" + name)) {
			    	  pbar.repaint();
			    	  pbar.validate();
			        try { Thread.sleep(2000); } 
			        catch (InterruptedException ex) {}
			        
			      }
			      pbar.dispose();
			    }			    
			    
			  };
// Thread der die ProgressBar erzeugt
Runnable runnable2 = new Runnable() {
			
				    public void run() {
	progressBar.setIndeterminate(true);
				    	  	  pbar.setTitle("Bitte warten");
						  pbar.setAlwaysOnTop(true);
						  pbar.setResizable(false);
						  pbar.add(progressBar);
						  pbar.setLocationRelativeTo(PrintM0100.my_dialog);
						  pbar.pack();
						  pbar.setVisible(true);
					}
}

Thread thread2 = new Thread(runnable2);
	      thread2.start();
Thread thread = new Thread(runnable);
		  thread.start();	


// erstellen des PDF
parameter.put("sql_string",  sql_string  ); 
				try {
					jasperReport = JasperCompileManager.compileReport(path + "\\" + name);
					jasperPrint = JasperFillManager.fillReport(jasperReport, parameter, DBHandler.getConnection());
					
				} catch (JRException e) {
					e.printStackTrace();

bekomme es einfach nicht hin das die ProgressBar einfach StandAlone weiter läuft..
PLZ HELP!!
 
Zurück