Hallo!
Ich hab folgendes Problem: Ich hab hier so ein Analyse-Tool geschrieben, das u.a. Balken-Diagramme am Bildschirm anzeigt. Diese Diagramme soll ich jetzt zu einem "Bericht" zusammenfassen und speichern. Die Diagramme sind eine Subklasse von JPanel und diese will ich mit Hilfe eines BufferedImage als JPG abspeichern, um sie in weiterer Folge in ein HTML-File reinklatschen zu können.
Allerdings hab ich das Problem, das mir das Programm ab und zu beim allerersten Diagramm folgende Exception wirft:
Das heißt also das erste Diagramm hat eine Höhe und Breite von 0. Nur warum?
Meines Wissens nach übernimmt die Berechnung der size der jeweilige Layout-Manager und da das Diagramm auch vor dem Export angezeigt wird, sollte er auch die Größe berechnet haben, aber offensichtlich werden die Werte gar nicht gesetzt?!?! Wann werden diese Werte denn nun gesetzt bzw. warum bekomme ich da diese Exception? Die Exception tritt, wie gesagt, nur beim ersten Diagramm auf.
Der Vollständigkeit halber noch die restlichen aufgerufenen Methoden. Vielleicht hab ich da ja Mist gebaut
generateHtml wird aufgerufen wenn ich diesen Bericht speichern will.
Während des Exports wird der Bericht auch angezeigt. currPage ist dabei ein Integer-Zähler, der die aktuelle Bericht-Seite darstellt.
Danke schon mal für eure Hilfe!
Mfg,
Ronny
Ich hab folgendes Problem: Ich hab hier so ein Analyse-Tool geschrieben, das u.a. Balken-Diagramme am Bildschirm anzeigt. Diese Diagramme soll ich jetzt zu einem "Bericht" zusammenfassen und speichern. Die Diagramme sind eine Subklasse von JPanel und diese will ich mit Hilfe eines BufferedImage als JPG abspeichern, um sie in weiterer Folge in ein HTML-File reinklatschen zu können.
Code:
private void exportDiagram(String path, String filename) {
Component comp = pObj1.getComponent(1);
if (comp instanceof JPanel) {
JPanel item1 = (JPanel) comp;
int w = item1.getWidth();
int h = item1.getHeight();
//Bild erstellen
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D big2d = bi.createGraphics();
//JPanel in das BufferedImage zeichnen
item1.paint(big2d);
//Bild als JPG abspeichern
File file = new File(path + filename);
try {
ImageIO.write(bi, "jpg", file);
}
catch (Exception e) {
e.printStackTrace();
}
} //if instanceof JPanel
} //exportDiagram()
Allerdings hab ich das Problem, das mir das Programm ab und zu beim allerersten Diagramm folgende Exception wirft:
Code:
java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
Das heißt also das erste Diagramm hat eine Höhe und Breite von 0. Nur warum?
Meines Wissens nach übernimmt die Berechnung der size der jeweilige Layout-Manager und da das Diagramm auch vor dem Export angezeigt wird, sollte er auch die Größe berechnet haben, aber offensichtlich werden die Werte gar nicht gesetzt?!?! Wann werden diese Werte denn nun gesetzt bzw. warum bekomme ich da diese Exception? Die Exception tritt, wie gesagt, nur beim ersten Diagramm auf.
Der Vollständigkeit halber noch die restlichen aufgerufenen Methoden. Vielleicht hab ich da ja Mist gebaut
generateHtml wird aufgerufen wenn ich diesen Bericht speichern will.
Code:
public File generateHtml(String title, File file) {
String htmlHeader = "<html><head><title>" + title + "</title></head><body>";
String htmlBody = new String();
String htmlFooter = "</body></html>";
Vector vHeader = rep.getHeaders();
Vector vItems = rep.getItems(); //Die Diagramme des Berichts
for (currPage = 0; currPage < vItems.size(); currPage++) {
htmlBody += "
" + vHeader.elementAt(0) + "
";
String filename = "diagram" + currPage + ".jpg";
this.updatePage();
this.exportDiagram(file.getAbsolutePath(), filename);
htmlBody += "<img src=\"" + file.getAbsolutePath() + filename + "\">";
}
String html = htmlHeader + htmlBody + htmlFooter;
//HTML-File speichern
try {
FileWriter fw = new FileWriter(file);
fw.write(html);
fw.close();
}
catch (IOException e) {
e.printStackTrace();
}
return file;
} //generateHtml
Während des Exports wird der Bericht auch angezeigt. currPage ist dabei ein Integer-Zähler, der die aktuelle Bericht-Seite darstellt.
Code:
private void updatePage() {
pObj1 = new JPanel(new BorderLayout());
JPanel pHeader1 = new JPanel();
Vector repItems = rep.getItems();
JScrollPane spObj1 = new JScrollPane(pObj1);
spObj1.setViewportView(pObj1);
cp.add(spObj1, BorderLayout.CENTER);
//Header einfügen
Vector vHeader = rep.getHeaders();
JLabel lHeader1 = new JLabel( (String) vHeader.elementAt(0));
pHeader1.add(lHeader1);
pObj1.add(pHeader1, BorderLayout.NORTH);
//Diagramm einfügen
Object repItem1 = repItems.elementAt(currPage);
if (repItem1 instanceof Diagram) {
Diagram dia = (Diagram) repItem1;
pObj1.add(dia.getGui(), BorderLayout.CENTER);
}
//Panel neu zeichnen
cp.getParent().paintComponents(cp.getParent().getGraphics());
} //updatePage()
Danke schon mal für eure Hilfe!
Mfg,
Ronny