Dannyboy Geschrieben 6. November 2008 Geschrieben 6. November 2008 (bearbeitet) Hallo, wie der Threadtitel erahnen läßt habe ich aktuell Probleme bei meiner eigens implementierten Drucken-Methode (in meiner Klasse wird das Interface Printable implementiert). Und zwar ist es so das ich zwar das Panel 1:1 ausdrucken kann und es auch vom Aufbau so aussieht wie ich es haben möchte, es aber passiert das wenn ich zwei unterschiedliche Informationen über Datensätze habe er mir komischerweise 2-Mal dasselbe ausdruckt. Mit anderen Worten gehe ich so vor: Ich lasse mir einen Datensatz als übersichtliche Seite mit Information A anzeigen, klicke dann in meinem visualisierten Panel (ist eben diese neue Seite) unterhalb auf Drucken, dann poppt das Standard Druck Menü auf und ich bestätige einfach mit "OK" (und angewählt sind mein Netzwerkdrucker sowie der Druckbereich "Alles")! Jetzt klick ich nach dem Abschicken des Druckauftrags auf Abbrechen (um eben die visualisierte Seite zu schließen) und lass mir eine Information B (aus einem anderen Datensatz) anzeigen. Diese möchte ich auch ausdrucken (nach obigem Schema geh ich vor). Was passiert? Es kommen zwar 2 Seiten nach ca. 10 - 15 Sekunden aus dem Drucker, aber er druckt mir 2 Mal die Information B aus! Jetzt frage ich mich, wie ich sicherstellen kann, das eben bei beliebig vielen anstehenden Druckaufträgen im Spool die Werte auch intern beibehalten werden und er mir auch die Sachen so ausdruckt wie ich sie erwarte (im obigen Fall ja Information A und Information . Momentan überschreibt er mir ja quasi in meinem PrintJob den Wert! Anbei mal der Quellcode: Erst einmal die Methode die aufgerufen wird wenn man auf dem Button "Drucken" klickt: ------------ private void performDrucken() { SwingWorker swingWorker = new SwingWorker() { public Object construct() { performDruckenHelper(); return this; } }; swingWorker.start(); } Hier wird eben ein eigener Thread erzeugt so das der Anwender parallel neben dem Drucken Prozess auch weiterhin ohne Hänger andere Datensätze suchen kann Dann folgt die Methode die mir den PrintJob liefert und das eigentliche Drucken anstartet: ----------- private void performDruckenHelper() { //PrintJob PrinterJob printjob = PrinterJob.getPrinterJob(); printjob.setPrintable(this); if (printjob.printDialog() == false ) return; try { printjob.print(); System.out.println("End PrintJob.print()"); } catch(Exception PrintException){ PrintException.printStackTrace(); } } Abschließend meine Print()-Methode: ------------------- public int print(Graphics g, PageFormat pageFormat, int page) throws PrinterException { Graphics2D g2d; if(page == 0) { //erstellt ein Graphics 2D Objekt g2d = (Graphics2D) g; g2d.setColor (Color.black); pageFormat.setOrientation(PageFormat.PORTRAIT); disableDoubleBuffering(view.getDateiauskunftDetailsPanel()); // Höhe und Breite von der Seite sowie dem Panel Dimension d = view.getDateiauskunftDetailsPanel().getSize(); double panelWidth = d.width; double panelHeight = d.height; double pageHeight = pageFormat.getImageableHeight(); double pageWidth = pageFormat.getImageableWidth(); double scaleX = pageWidth / panelWidth; double scaleY = pageHeight / panelHeight; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); g2d.scale(scaleX, scaleY); view.getDateiauskunftDetailsPanel().print(g2d); return (PAGE_EXISTS); } else return (NO_SUCH_PAGE); } An welcher Stelle ist der Fehler? Zunächst dachte ich das der PrintJob mit einer internen end()-Methode beendet werden muss aber das gibts hier irgendwie nicht (nach dem Drucken scheint sich der Job selber zu beenden). Nur er darf mir ja nicht unterschiedliche Informationen quasi immer mit dem zuletzt angestarteten Druck überschreiben. Könnt Ihr mir hier nen Tipp geben? Bearbeitet 6. November 2008 von Dannyboy Zitieren
Dannyboy Geschrieben 6. November 2008 Autor Geschrieben 6. November 2008 (bearbeitet) Habs selber jetzt wohl richtig hinbekommen! Muss es allerdings noch etwas testen. Bearbeitet 6. November 2008 von Dannyboy Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.