FontMetrics - Negative Breite/Höhe bei großer Schrift

X5-599

Top Contributor
Schönen Freitag zusammen,

Mein Problem: Um Text auf einem Image zu zentrieren muss ich die Texthöhe und Breite ermitteln. Soweit auch kein Problem. FontMetrics liefert die Werte, ich verarbeite sie und alles sieht gut aus. Mache ich aber die Schriftgröße zu groß, kommen statt der richtigen Werte deren negative zurück. z.B. 140 wird zu -139.
Ist das ein Bug von FontMetrics? Ich habe nämlich nichts diesbezüglich finden können.

Java:
Graphics g; // wird übergeben
int breite = g.getFontMetrics(font).stringWidth("Testaufschrift");

Der Fehler scheint nur aufzutreten, wenn die Orientation des PrintRequestAttributeSet auf Landscape gestellt wird...

Hat das irgendjemand bereits bemerkt?
 

AmunRa

Gesperrter Benutzer
Mach mal ein kurzes Beispiel das kompilierfähig ist und an dem man das Verhalten sehen kann.
Ich kann mir das gerade nicht vorstellen.
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Ist ein zu großes Gerüst um es hier zu posten. Ich komme so jedenfalls nicht dahinter warum die stringWidth Methode negative Werte rausgibt, da sich in diese Klassen nicht rein debuggen lässt. Sourcen dazu fehlen natürlich auch. Bisher hatte ich angenommen daß alle Klassen des JDK als Source ausgeliefert würden. Aber da habe ich mich wohl geirrt...
 

AmunRa

Gesperrter Benutzer
Was bitte bedeutet

> "Mache ich die Schriftgröße zu groß? "

Wie setzt du die Schriftgröße ? Von welchen Werten sprechen wir?

Mach wie gesagt ein KSKB bei dem der Fehler auftritt. Das ganze muss ja e blos eine Klasse sein

Wie erzeugst du denn den Font?


Edit: Hab mal selbst ein kurzes Beispiel gemacht an dem du jetzt blos die Erzeugung deines Fonts ändern musst. Der Code den ich da geschrieben hab ist übrigens extremst lang und ich bin da voll lang dabei gesessen. Daher will ich dann schon ein Lob

Java:
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test extends JPanel{
 
	
	private String text= "DAS IST MEIN TEST STRING";
	
	public static void main(String[] args){
		JFrame f= new JFrame("TESTFRAME");
		f.setSize(1200,800);
		f.setContentPane(new Test());
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
	
	@Override
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		
		Font f= new Font("sans", Font.BOLD,84);
		g.setFont(f);
		
		FontMetrics fm = this.getFontMetrics(f);
		
		System.out.println(fm.stringWidth(text));
		
		g.drawString(text,20,500);
		
		
	}
	
	
}
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Ein KSKB ist nur sehr schwer möglich, da viele Klassen einzelne Aufgaben übernehmen. (Es geht übrigens um Druckaufträge) Die müsste ich erstmal auseinanderfrickeln...

Nach meinen Recherchen gibt das Graphics Objekt den Ausschlag welches man vom Printable Interface bekommt. Das scheint sich zu verändern wenn man im PrintRequestAttributeSet, welches dem PrinterJob übergeben wird, die Orientierung (LANDSCAPE / PORTRAIT) ändert. Es ist auch nicht einfach der Grund, daß die Schrift zu groß wird, denn z.B:

Schriftgröße: 38 im LANDSCAPE Modus gibt einen negativen Wert.
Schriftgröße: 38 im PORTRAIT Modus gibt einen positiven Wert.

Schriftgröße: 138 im LANDSCAPE Modus gibt einen positiven Wert.
Schriftgröße: 138 im PORTRAIT Modus gibt einen positiven Wert.


Wenn ich an der Stelle, wo die Breite des String berechnet werden soll das Graphics Objekt (vom Printable Interface) durch ein "neues" austausche, bekomme ich bei allen genannten Tests positive Werte. Die unterscheiden sicht zwar leicht von denen des Printable-Graphics Objektes, aber immerhin sind alle positiv...

Also denn versuche ich mal, ob ich alles in eine Klasse bekomme
 

Andi_CH

Top Contributor
Irgendwie tönt das nach einem Überlauf, so ungefähr nach dem Motto:

Java:
	public static void main(String... args) {
		int i = 128;
		System.out.print(i + "   " + (byte)i);
	}
Ausgabe:
Code:
128   -128
 

Ähnliche Java Themen

Neue Themen


Oben