Druckprobleme bei verschiedenen Schriftarten/-größen

  • Themenstarter Themenstarter Jub
  • Beginndatum Beginndatum
J

Jub

Gast
Hallo,

ich habe ein Problem beim Drucken eines Labels. Dieses tritt je nach Länge des Textes, Anzahl der Leerzeichen, usw. bei unterschiedlichen Schriftarten/-größen und -stilen auf. Das folgende Beispiel zeigt das Problem bei Arial, Fett, Größe 22: die Leerzeichen verschwinden. Verändere ich den Text, tritt das bei anderen Schriftgrößen auf. Ach so, im Frame stellt er es richtig dar, aber nach dem Druck sind die Leerzeichen erst verschwunden.
Ich verwende Windows XP, 64 bit, JDK 7. Gleiches Problem auf Windows 7, 32 bit, 64 bit, JDK 6, ...
Unter JDK 5 keine Probleme.
Kann das Problem jemand bestätigen?

Java:
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.Vector;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PrintTest extends JFrame {

	private PrintPanel panel;

	public static void main(String[] args) {
		PrintTest frame = new PrintTest();
		frame.pack();
		frame.setVisible(true);
		frame.print();
	}
	public PrintTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		panel = new PrintPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		Vector<Font> fonts = new Vector<Font>();
		String fontName = "Arial";
		for (int i = 18; i < 29; i++) {
			fonts.add(new Font(fontName, Font.PLAIN, i));
			fonts.add(new Font(fontName, Font.BOLD, i));
		}
		for (int i = 0; i < fonts.size(); i++) {
			JLabel label = new JLabel();
			label.setText("IYBN Isakjfgsdulgflwehflet flr asdf. Msjahfuhuihsdilf");
			label.setFont(fonts.get(i));
			panel.add(label);
		}
		add(panel);
		
	}

	private void print() {
		PrinterJob pj = PrinterJob.getPrinterJob();
		pj.setPrintable(panel);
		if(pj.printDialog()){
			try {
				pj.print();
			} catch (PrinterException e) {
				e.printStackTrace();
			}
		}
	}

	class PrintPanel extends JPanel implements Printable {

		@Override
		public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
				throws PrinterException {
			if(pageIndex>0){
				return NO_SUCH_PAGE;
			}
			Graphics2D g2d = (Graphics2D) graphics;
			g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
			double scale = pageFormat.getImageableWidth()/getWidth();
//			g2d.scale(scale, scale);
			this.paint(g2d);
			return PAGE_EXISTS;
		}
	}
	
}
 
Ruf in der print()-Methode anstelle von
Code:
this.print()
mal
Code:
super.print()
auf, vielleicht hilft das schon. Ich würde zumindest erstmal die Fehler im Code suchen als in der Java-Implementierung.
 
Da PrintPanel von JPanel erbt und ich die Methode
Code:
JComponent.paint(Graphics g) {}
nicht überschreibe wird ja automatisch super aufgerufen, falls du [JAVA=72]this.paint(g2d);[/code] meinst. Habe den Code eigentlich schon arg zurechtgestutzt, sodass der Fehler eigentlich nur noch in der Java-Implementierung liegen kann. Hast du den Code mal ausgeführt?
 
Habe mich selbst vertippt ... ja ich meinte den
Code:
this.paint(g2d)
Aufruf. Aber den solltest du versuchsweise mal mit
Code:
super.print(g2d)
ersetzen. In deinem Panel überschreibst du ja
Code:
print()
, rufst aber nie die Basismethode auf. Die macht vielleicht einige Dinge um deine Probleme zu beheben.
 
Habe ich ersetzt, aber wie gesagt, super wird sowieso aufgerufen, da ich
Code:
paint(Graphics g)
nicht überschrieben habe. Mit der überschriebenen
Code:
print()
meinst du da die
Code:
print(Graphics graphics, PageFormat pageFormat, int pageIndex)
-Methode? Die kommt ja aus dem interface
Code:
Printable
. Muss also überschrieben werden.
 
Das JPanel hat selbt eine Methode
Code:
print(Graphics)
, die meine ich. Und ja, du hast wieder Recht, du überschreibst natürlich die Printable-Methode, nicht die von JPanel (... Wochenende ruft).
Ich will darauf hinaus: Ruf die
Code:
print()
-Methode vom JPanel auf 🙂
Um das
Code:
paint()
geht es mir gar nicht.
 
Ah ok, hab's verstanden. Hab ich gemacht, aber das ändert auch nichts. Da wird ja nur die Flag gesetzt, dass gedruckt wird, und anschließend die
Code:
paint(Graphics g)
aufgerufen. Das ist schon mal nicht der Fehler. Ich vermute den Fehler irgendwo an der Schnittstelle JVM, PostScript, Drucker, da auf dem Bildschirm ja alles funktioniert. Komisch ist auch, dass es bei verschiedenen Textlängen, unterschiedlicher Anzahl Leerzeichen bei verschiedenen Schriftgrößen auftritt.
 
Jpanel hat ja keine
Code:
print()
-Methode, sondern nur
Code:
print(Graphics g)
. Die habe ich verwendet.
 

Zurück
Oben