2006 IR Open Discussion Posted August 19, 2006 Share Posted August 19, 2006 By: Andrew Matthews - namxat Programmatically placing an Image in a band 2003-06-05 12:46 Hello. I need to programmatically create a JasperDesign object ( as in a dori.jasper.engine.JasperDesign object, NOT an XML flat file ), embed a java.awt.Image in the detail ( via the setDetail method of JasperDesign), and then compile, fill, and print the report. Here's what I have and know how to do : -- I know how to obtain the java.awt.Image. -- I know how to programmatically create the JasperDesign object. -- I know how to compile, fill, and print the JasperDesign object. What I need to know is this: how do I associate my image with the detail band? Consider the following code: public void makeReport ( java.awt.Image image ) { JasperDesign jd = new JasperDesign(); JRDesignBand detailBand = new JRDesignBand(); JRDesignImage designImage = new JRDesignImage(); /** * Mystery code here: I can only assumethat this * where I associate my java.awt.Image with * my JRDesignImage object. The API documentation * is sparse, as is the PDF documentation. */ jd.setDetail(detailBand); JasperCompileManager.compileReport(jd)... etc... etc... } WHAT I WANT TO DO: I do NOT want to resort to using a servlet to do this; I am looking for the minimal amount of code to associate a java.awt.Image object with a JRDesignImage object. By: Andrew Matthews - namxat Now I'm in NoClassDefFoundError hell... 2003-06-09 13:55 Hello. I figured out ( almost ) how to do what I want. Consider the following code: JRDesignExpression expression = new JRDesignExpression(); expression.setValueClass(java.awt.Image.class); Image chartImg = (Image)chart.createBufferedImage( width, height ); int imgID = ImageRegistry.add( chartImg ); expression.setText( "com.myPackage.ImageRegistry.get(" + imgID + ", true)" ); JRDesignBand detail = new JRDesignBand(); detail.setHeight( height ); image.setExpression( expression ); detail.addElement( image ); jd.setDetail( detail) ; Now, to clarify a couple of things: chart is the JFreeChart, obviously. ImageRegistry is a static class that allows me to register and then retrieve images. I compile this, and it compiles fine. When I run it, however, I get the following output: ******************************************************************** * WARNING: Unable to compile with "sun.tools.javac.Main" compiler. * * Cause : java.lang.ClassNotFoundException : sun.tools.javac.Main * * Compiling with command line "javac" compiler. * ******************************************************************** java.lang.NoClassDefFoundError: com/myPackage/ImageRegistry Now here's the deal: I am used to seeing the warning message, although it is somewhat disconcerting. the NoClassDefFoundError, however, I don't see how I am generating. I have checked the classpath serveral times. I have set the "java.ext.dirs" system property, as well. I even went so far as adding the following code: String classpath = System.getProperty( "java.class.path" ); String pathSep = System.getProperty("path.separator"); String fileSep = System.getProperty("file.separator"); classpath += pathSep + System.getProperty("java.library.path"); classpath += " -Djava.ext.dirs=" + System.getProperty("java.ext.dirs"); classpath += pathSep + System.getProperty("java.home") + fileSep + "lib"; System.setProperty( "java.class.path", classpath ); Still, the the warning and the NoClassDefFoundError kept rearing their ugly heads. Now, I should probably say that I try to avoid LIKE THE PLAGUE hard-coding references to .jar archives. Also, given the large number of .jar archives our company uses, I also try to avoid LIKE THE PLAGUE having to explicitly add every single .jar archive to the classpath. Instead, we store all our .jar archives in one directory, and then simply add the "-Djava.ext.dirs" directive as one of our java flags. What do I need to do to get rid of these warnings and errors? By: Andrew Matthews - namxat This is on a Windows 2000 PC, by the way. 2003-06-09 14:01 Just thought I should mention that little fact. I forgot to in my post. By: Emil Einarsson - eeinarsson RE: Programmatically placing an Image in a band 2003-06-11 01:51 You might need to set the classpath in the system property "jasper.reports.compile.class.path" in order to get this to work, as the compiler spawns a new javac process, which does not register the programmatic changes to the class path. Good luck, regards Emil Einarsson By: Andrew Matthews - namxat Still not working... 2003-06-11 04:44 Thanks for taking a crack at it, Emil, but it's still not working. I added the following two lines of code: String classpath = System.getProperty("java.class.path"); System.setProperty("jasper.reports.compile.class.path", classpath); I still get the same NoClassDefFoundError: com/mypackage/ImageRegistry I copied my tools.jar archive into the same directory as the JasperReports jar, and got rid of the warning, though. I do not appear to be having any problem actually compiling the report; it's filling it that is giving me grief. Here is a ( partial ) stack trace: java.lang.NoClassDefFoundError: com/mypackage/ImageRegistry at Chart.evaluate(Chart.java:106) at dori.jasper.engine.fill.JRCalculator.evaluate(JRCalculator.java:678) Incidentally: I do not think it matters, but I should probably mention that my com.mypackage.ImageRegistry object is not a scriptlet; it is a singleton with a collection of public methods. Does anybody have any ideas on what's causing the fill process to throw a NoClassDefFoundError, or how to correct it? By: Emil Einarsson - eeinarsson RE: Still not working... 2003-06-11 06:32 I have managed to recreate your problem exactly, and I am as puzzled as you are. I think (pursuing this at the moment) that the issue is related to how the resulting report class file is loaded by the classloader. I'm working with jasperreports as part of a large Eclipse plugin project, so class loading issues arise from time to time. By: Emil Einarsson - eeinarsson RE: Programmatically placing an Image in a band 2003-06-11 07:10 Ok. This issue is the same as the one discussed in the thread "Suggestion: a solution to JRClassLoader issue". See that thread for more information! Emil By: Teodor Danciu - teodord RE: Programmatically placing an Image in a band 2003-07-07 12:35 Hi, This has been solved in the new 0.5.0 version. Thank you, Teodor Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now