2009-08-01 4 views
0

Ich render Text mit einem benutzerdefinierten Tabellenzellen-Renderer und ich möchte den gezeichneten Text trimmen, wenn es die aktuelle Zellenbreite überschreiten würde, um zu "Dieser Text ist zu lang ... "eine Art Darstellung, bei der die drei Punkte am Ende nie die Bounding Box verlassen. Mein aktueller Algorithmus ist folgende:Wie man Text in eine Box rendert und überschüssiges durch drei Punkte ersetzt

FontMetrics fm0 = g2.getFontMetrics(); 
int h = fm0.getHeight(); 
int ellw = fm0.stringWidth("\u2026"); 
int titleWidth = fm0.stringWidth(se.title); 
if (titleWidth > getWidth()) { 
    for (int i = se.title.length() - 1; i > 0; i--) { 
     String tstr = se.title.substring(0, i); 
     int tstrw = fm0.stringWidth(tstr); 
     if (tstrw + ellw < getWidth()) { 
      g2.drawString(tstr, 2, h); 
      g2.drawString("\u2026", 2 + tstrw, h); 
      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, h); 
} 

Gibt es eine bessere Art und Weise zu bestimmen, wie viele Zeichen sollte ich drawString() bevor sie an den ... (u2026) Zeichen zu wechseln?

Antwort

0

Dies ist das Standardverhalten des Standard-Renderers für eine Tabelle, so dass ich nicht sicher bin, verstehe ich den Grund dafür.

Aber ich habe einen Renderer für Punkte auf der linken Seite erstellt ("... Text ist zu lang"), die eine vollständige Möglichkeit zeigt, was Sie wollen, da es eine mögliche Grenze auf dem Renderer und berücksichtigt der Interzellenabstand des Renderers. Schau dir die LeftDotRenderer an.

+0

Danke. Der Grund dafür ist, dass die erste Zeile (ein Titel) in 16pt-Text gezeichnet wird und die zweite und dritte Zeile (einige Details) als normaler Text innerhalb der Zelle gezeichnet werden. Der LeftDotRenderer unterscheidet sich hauptsächlich dadurch, dass er statt der gesamten Stringbreite die Größe pro Zeichen zählt. Ich werde es testen. – akarnokd

0

Ich kann nicht an eine andere Möglichkeit denken, den gewünschten Effekt zu erzielen, aber Sie sollten in der Lage sein, die 2 drawString() - Aufrufe durch eins zu ersetzen. Es ist schon eine Weile her, seit ich Java geschrieben habe, aber ich denke, das Folgende sollte funktionieren.

BTW, änderte ich die Variablennamen, damit ich den Code lesen kann. : p

FontMetrics metrics = g2.getFontMetrics(); 
int fontHeight = metrics.getHeight(); 
int titleWidth = metrics.stringWidth(se.title); 

if (titleWidth > getWidth()) { 
    String titleString; 

    for (int i = se.title.length() - 1; i > 0; i --) { 
     titleString = se.title.substring(0, i) + "\u2026"; 
     titleWidth = metrics.stringWidth(titleString); 

     if (titleWidth < getWidth()) { 
      g2.drawString(titleString, 2, fontHeight); 

      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, fontHeight); 
} 
Verwandte Themen