auf fertigstellung reagieren

Dann zeig doch deinen geänderten Code nochmal und klick dann hier auch auf fertig, dann können andere aus der Sache auch noch lernen ;)
 
sobald es komplett ist..
denn ein Bitte Warten Fenster kann ich öffnen ...
nur die JProgressBar friert immer noch ein!!

Klasse MyProgressBar
Code:
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class MyProgressBar {
	static JFrame			frame = new JFrame();
	static JProgressBar	progressBar = new JProgressBar();
	
	MyProgressBar(boolean isIndeterminate, Component parent, boolean isAlwaysOnTop){
		progressBar.setIndeterminate(isIndeterminate);
		frame.add(progressBar);
		frame.pack();
		frame.setLocationRelativeTo(parent);
		frame.setAlwaysOnTop(isAlwaysOnTop);
		frame.setVisible(true);
		
	}
	
	public static void disableMyProgressBar(){
		frame.setVisible(false);
	}
	
	 
}

der Aufruf
beim klick auf ja
Code:
	    btn_pbar_ja.addActionListener(new ActionListener(){
	    	public void actionPerformed(ActionEvent ae) {
	    		 pbar.dispose();
	    		 
	    		 new MyProgressBar(true,PrintM0100.my_dialog,true);

	    		 
	    	 EventQueue.invokeLater( new Runnable()
	    	  {
	    	    public void run() {
	    	    	createReport(); 
	    	    }
	    	  } );
	    	 
		    	
    		 EventQueue.invokeLater( new Runnable()
    		  {
    		    public void run() {
    		         MyProgressBar.disableMyProgressBar();
    		    }
    		  } );
    		 
    		 
	    	}
	    });
 
also mit dem Balken will das einfach nicht..
hier nochmal ein ansatz...

Code:
	    btn_pbar_ja.addActionListener(new ActionListener(){
	    	public void actionPerformed(ActionEvent ae) {
	    		pbar.dispose();
	    		 
	    		new MyProgressBar(true,PrintM0100.my_dialog,true);

	    		
	    	    new Thread() {
	    	        @Override public void run() {
	    	        	setPriority( Thread.MIN_PRIORITY );
	                    float filesize = 0;

	                    while (filesize != MyFile.getFileSize(path_name) || filesize == 0) {
	    	        		try { Thread.sleep(2000); }
	    	        		catch (InterruptedException ex) {}
	    	                        // das wir alle 2 sekunden ausgegeben.. also funktionieren tuts
	    	        		System.out.println("****" + path_name);
	    	        		System.out.println("****" + MyFile.getFileSize(path_name));
	    	        		
                                       // aber die ProgressBar wird nicht neu gezeichnet!!
	    	        		MyProgressBar.frame.validate();
	    	        		MyProgressBar.frame.repaint();
	    	        		
	    	        		filesize = MyFile.getFileSize(path_name);
	    	        	}
	    	        }
	    	    }.start();
	    		
	    		 
		    	EventQueue.invokeLater( new Runnable()
		    	{
		    	    public void run() {
		    	    	createReport(); 
		    	    }
		    	} );
	    	 
		    	EventQueue.invokeLater( new Runnable()
		    	{
		    		public void run() {
		    			MyProgressBar.disableMyProgressBar();
		    		}
		    	} );
    		 
    		 
	    	}
	    });

warum will das nicht?
 
Habe inzwischen den Ansatz in JasperReports gefunden:

Code:
public class MyJRExportProgressMonitor implements JRExportProgressMonitor {
  public void afterPageExport() {
    System.out.println("PDF ist fertig");
  }
}

Code:
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME, filledReportFileName);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, pdfFileName);
exporter.setParameter(JRPdfExporterParameter.IS_COMPRESSED, Boolean.TRUE);
exporter.setParameter(JRExporterParameter.PROGRESS_MONITOR, new MyJRExportProgressMonitor());
exporter.exportReport();
 
hmmm jetzt hab ich nur noch das Problem das es bei rtf nicht geht!
habe alles befolgt und bei xml, pdf und html funktioniert es auch.. aber bei rtf läuft der Ladebalken einfach weiter.. endlos..

hier mal der code

Code:
// HTML erzeugen und anzeigen
  private static void createHTML() {
	  path_name = MyParam.getPath_TEMP_REPORTS() +  "\\Artikel_"+System.nanoTime()+".html";
    try{
      JRHtmlExporter exporter = new JRHtmlExporter(); 
      exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
      exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path_name);
      exporter.setParameter(JRExporterParameter.PROGRESS_MONITOR, new MyProgressBar(true,PrintM0100.my_dialog,true));
      exporter.exportReport();  
    }catch(Exception ex){
      JOptionPane.showMessageDialog(null, "EXCEPTION : JHSWView/createHTML \nFehler beim erstellen des HTML-Files");
    }
    showReport(path_name);
  }
//RTF erzeugen und anzeigen
  private static void createRTF() {
	  path_name = MyParam.getPath_TEMP_REPORTS() +  "\\Artikel_"+System.nanoTime()+".rtf";
    try{
      JRRtfExporter exporter = new JRRtfExporter ();
      exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
      exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path_name);
      exporter.setParameter(JRExporterParameter.PROGRESS_MONITOR, new MyProgressBar(true,PrintM0100.my_dialog,true));
      exporter.exportReport();  
    }catch(Exception ex){
      JOptionPane.showMessageDialog(null, "EXCEPTION : JHSWView/createRTF \nFehler beim erstellen des RTF-Files");
    }
    showReport(path_name);
  }

druck auf Button
Code:
	    btn_pbar_ja.addActionListener(new ActionListener(){
	    	public void actionPerformed(ActionEvent ae) {
	    		pbar.dispose();
	    		 
	    		new MyProgressBar(true,PrintM0100.my_dialog,true);

	    	    new Thread() {
	    	        @Override public void run() {
	    	        	//setPriority( Thread.MIN_PRIORITY );
	                    createReport(); 
	    	        }
	    	    }.start();	 
	    	}
	    });
Klasse MyProgressBar
Code:
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JSlider;

import net.sf.jasperreports.engine.export.JRExportProgressMonitor;

public class MyProgressBar implements JRExportProgressMonitor {
	static JFrame			frame = new JFrame();
	static JProgressBar	progressBar = new JProgressBar();
	static JSlider slider;
	static int value = 0;
	MyProgressBar(boolean isIndeterminate, Component parent, boolean isAlwaysOnTop){
		progressBar.setIndeterminate(isIndeterminate);
		frame.add(progressBar);
		frame.pack();
		frame.setLocationRelativeTo(parent);
		frame.setAlwaysOnTop(isAlwaysOnTop);
		frame.setVisible(true);
	}

	@Override
	public void afterPageExport() {
		frame.setVisible(false);
	} 
}
 
Zuletzt bearbeitet:
Ich glaub ich hab das erste mal nen Bug gefunden ;)
Ich habe es jetzt mal mehr oder weniger schön gelöst..
IST NUR BEI RTF SO NÖTIG!!

wenn jemand was anderes weiss kann er mich gerne anschreiben ;)

Code:
  private static void createRTF() {
    try{
      JRRtfExporter exporter = new JRRtfExporter ();
      exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
      exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path_name);
      exporter.setParameter(JRExporterParameter.PROGRESS_MONITOR, new MyProgressBar(true,PrintM0100.my_dialog,true));
      exporter.exportReport();  
    }catch(Exception ex){
      JOptionPane.showMessageDialog(null, "EXCEPTION : JHSWView/createRTF \nFehler beim erstellen des RTF-Files");
    }
    
    showReport(path_name);
// jetzt wird einfach hier die ProgressBar unsichtbar gemacht 
    MyProgressBar.frame.setVisible(false);
  }
 
Hi
Was ja wirklich lange dauert ist nicht das erstellen des PDFs sondern das Sammeln der Daten. Ich nehme jetzt einfach mal an dass du die Daten aus ner Datenbank hollst und dies direkt beim Report hinterlegt hast (Datenquelle und so). Wenn du nun aber die Daten mit Java aus der DB rausholst und diese dann als Datenquelle dem Report übergibst kannst du schön deinen Ladebalken füllen (in Java ist es ja dann nicht so schwer herauszufinden wie viel Prozent schon abgearbeitet ist). Das eigentliche erstellen des PDFs geht dann weniger als 1sec (ausser es hat hunderte von Seiten).
 
Je nach Datenmenge muß man schon einige Tricks anwenden, um mit JasperReports wirklich schnell zu sein und ohne Absturz zum Ziel zu kommen.

In unserem Projekt beispielsweise gibt es einen Pdf-Report, der aus ca. 6000 Seiten besteht. Ich bin bald adlig geworden, denn ständig stürzte die Erstellung ab - wegen OutOfMemoryError! Selbst 1024MB für die VM reichten nicht aus. Mit verschiedenen "Umbaumaßnahmen" habe ich das Speicherproblem immer weiter nach hinten gedrängt und bin nun fast am Ziel.

Wenn's Euch interessiert, fasse ich demnächst meine Erfahrungen verständlich zusammen und hinterlege sie hier.
 
Erfahrungen zu JasperReports lese ich immer gerne, da ich beruflich damit öffters zu tun habe.

Ja JasperReports ist manchmal schon ansträngend.. Ich hatte mal nen Report der einen Printjob von über 2GB erstellte.... ^^
 
Zurück