Drucken - getFontMetrics()

Calculator

Grünschnabel
Hallo,

Ich arbeite gerade an einem Projekt, bei dem das Programm unter anderem
bestimmte Wörter unterstreichen, den fertigen Text auf den Bildschirm ausgeben und ausdrucken soll.
Am Bildschirm sieht noch alles ganz richtig aus, aber wenn man den Text ausdrucken will, sind die Linien unter den unterstrichenen Wörtern nicht genau unter dem Wort und sind etwas verschoben(nach links oder rechts).
Ich habe zuerst gedacht, dass es an getFontMetrics() liegt, weil ich mit Toolkit darauf zugegriffen habe. Wenn ich stattdessen das Graphics-Objekt von der print()-Methode
dafür benutze, sieht es zwar besser aus, aber die Unterstriche sind noch immer nicht ganz perfekt.

Ich habe das Problem jetzt in einem kleinen Beispiel zusammengefasst.
Seltsamerweise funktioniert hier das Unterstreichen mit g.getFontMetrics().
Auf den ersten Blick konnte ich in meinem größeren Programm keinen Fehler entdecken. Liefert g.getFontMetrics() noch immer keine genaue Angabe, oder steckt der Fehler doch irgendwo in meinem eigentlichen Programm?

Code:
import java.awt.*;
import java.awt.print.*;

public class UnderlineDrucker implements Printable{
	public UnderlineDrucker(){
		pJob(true);
	}
	public int print(Graphics g,PageFormat pageFormat,int pageIndex){
		if ( pageIndex >= 1 ){ 
		      return Printable.NO_SUCH_PAGE;
		}
		paintUnderline(g,"Ein Test",new Font("Georgia",Font.PLAIN,9));  //Bei
		return Printable.PAGE_EXISTS; //Georgia ist es am deutlichsten zu sehen
	}
	public void paintUnderline(Graphics g,String text,Font font){
		g.setFont(font);
		g.drawString(text,100,100);
		FontMetrics fm = g.getFontMetrics(font); //mit Toolkit - Linie zu lang
		g.fillRect(100,102,fm.stringWidth(text),2);
	}
	private void pJob(boolean dialog){
		 PrinterJob pjob = PrinterJob.getPrinterJob(); 
		 if(dialog){ 
			if ( pjob.printDialog() == false ){
				 return;
			}
		 }	   
		 pjob.setPrintable(this); 
		 try{
		  pjob.print();
		 }
		 catch (PrinterException e){
		  System.out.println("Drucken nicht möglich!");
		 }
    }
	public static void main(String[] args){
		new UnderlineDrucker();
	}
}
 
Versuch's mal mit java.awt.font.TextAttribute und java.text.AttributedString:

AttributedString as = new AttributedString(text);
as.addAttribute(TextAttribute.FONT, font);
as.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, 0, text.length());
g.drawString(as.getIterator(), 100, 100);
 
Zuletzt bearbeitet:
Danke für deine Antwort.
Damit funktionierts.
Ich glaube den Fehler in meinem Programm gefunden zu haben, weil ich einmal mit charWidth() zuerst die Breite jedes Buchstaben einzeln abgefragt und dann alles zusammengerechnet habe, was ein anderes Ergebnis ergibt, als wenn ich die ganze Breite des Strings auf einmal abfrage.
Trotzdem werde ich deine Lösung verwenden, wenn es, nachdem ich den Fehler behoben habe, immer noch nicht funktioniert.
 
Zurück