Ahoj,
mam Swing aplikaciu a potrebujem z nej tlacit, vyriesil som to tak, ze
kazda tlacova zostava bude JPanel(JXPanel) a bude zabaleny v jar, pri
nacitavani sa zobrazi v tlacovom dialogu, jar bude mat v sebe samotny
report, potrebne kniznice a konfiguracny panel (datum od-do, zakaznik a
pod., kvoli vyfiltrovaniu zaznamov, ktore budem tlacit), modul by som
chcel urobit natolko samostatny, aby sa vedel pustit a tlacit, ak by tam
bol main. Cize ked treba nova zostava, tak urobim modul, nakopirujem do
adreara reports a pridam ju do suboru reports.xml a to je cele, pri
dalsom otvoreni tlacoveho formulara sa objavi v zozname reportov. Hlavny
program o tlaci nebude mat ani sajnu, celu tlac bude robit modul. Tym
padom dokazem urobit lubovolnu tlacovu zostavu, pouzit reporting engine
a nemusim pri tom robit zasahy do hlavneho programu (som si isty, ze po
case pride poziadavka, ktorej sa nebude dat vyhoviet ani s touto
architekturou, ale aspon to oddialim :-) )
V hlavnej aplikacii pouzivam URLClassLoader a ked to pustam z eclipse,
tak sa modul nacita, ked urobim jar (pouzivam Fat JAR), tak pri
nacitavani modulu zahlasi toto:
Message:
java.lang.ClassCastException:
org.jdesktop.swingx.plaf.PainterUIResource cannot be cast to
org.jdesktop.swingx.painter.Painter
Level:
SEVERE
Stack Trace:
org.jdesktop.swingx.plaf.PainterUIResource cannot be cast to
org.jdesktop.swingx.painter.Painter
org.jdesktop.swingx.plaf.basic.BasicTitledPanelUI.installUI(BasicTitledPanelUI.java:123)
javax.swing.JComponent.setUI(Unknown Source)
javax.swing.JPanel.setUI(Unknown Source)
org.jdesktop.swingx.JXTitledPanel.setUI(JXTitledPanel.java:149)
org.jdesktop.swingx.JXTitledPanel.updateUI(JXTitledPanel.java:176)
javax.swing.JPanel.<init>(Unknown Source)
javax.swing.JPanel.<init>(Unknown Source)
javax.swing.JPanel.<init>(Unknown Source)
org.jdesktop.swingx.JXPanel.<init>(JXPanel.java:83)
org.jdesktop.swingx.JXTitledPanel.<init>(JXTitledPanel.java:121)
org.jdesktop.swingx.JXTitledPanel.<init>(JXTitledPanel.java:111)
org.jdesktop.swingx.JXTitledPanel.<init>(JXTitledPanel.java:101)
org.eltik.planovanie.reports.prehlad1.ReportPanel.getPanelObdobie(ReportPanel.java:183)
org.eltik.planovanie.reports.prehlad1.ReportPanel.getPanelFilter(ReportPanel.java:126)
org.eltik.planovanie.reports.prehlad1.ReportPanel.initialize(ReportPanel.java:90)
org.eltik.planovanie.reports.prehlad1.ReportPanel.<init>(ReportPanel.java:79)
org.eltik.planovanie.reports.prehlad1.ReportMain.getReport(ReportMain.java:51)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.eltik.planovanie.PrintDialog$4.run(PrintDialog.java:329)
java.lang.Thread.run(Unknown Source)
org.jdesktop.swingx.painter.Painter je interface a
org.jdesktop.swingx.plaf.PainterUIResource ho implementuje
Problem moze byt v tom, ze Fat JAR pouziva One-JAR (
http://one-jar.sourceforge.net/ ) a ten ma vlastny ClassLoader a na
nacitanie modulu pouzivam URLClassLoader. Ked na nacitanie modulu
pouzijem JarClassLoader z One-JAR, tak sa neviem dostat ku xml, v ktorom
je report (jFreeReport), lebo modul sam seba nevidi, aj ked vsetko
funguje :-) S Javou nemam este vela skusenosti, takze mozno nieco
robim zle (dufam, to sa da napravit, ak nie je problem medzi stolickou a
klavesnicou, tak sa to bude riesit tazsie :-) )
Jedno z rieseni je urobit workaround, modul otvori jar, z ktoreho je
spusteny, vykopiruje von co potrebuje, pouzije a ak sa nic nestane, tak
po sebe aj uprace, ale toto riesenie mi pripada dost pritiahnute za
vlasy :-)
Vedel by mi niekto nieco poradit alebo navrhnut a prijimam ak kritiku, vdaka
ya