9

I'm creating a graphical timeline out of an excel document and I need to have small tags of the name of the event next to the marker for that event. Some of these are easy and are right justified but others are left justified and I need to figure out their width so that I can properly offset them.

window.drawString("7/4-Fourth of July",horizontalIndex-Offset,verticalIndex);

Currently I'm averaging the pixel width using an average of both font sizes 10 and 32, but this doesn't really cut it. Can someone help me get the exact offset?enter image description here

kleopatra
  • 51,061
  • 28
  • 99
  • 211
if_zero_equals_one
  • 1,716
  • 4
  • 17
  • 30

5 Answers5

8

This thread explains how to do it: Calculate the display width of a string in Java

You should first get the font metrics, and then ask the metrics how wide a certain string is.

Community
  • 1
  • 1
Kaj
  • 10,862
  • 2
  • 33
  • 27
4

from a java.awt.Graphics object, you can call getFontMetrics. the FontMetrics object has a getStringBounds method that does what you need.

here's the documentation

Jeff Paulsen
  • 2,132
  • 1
  • 12
  • 10
4

and another good alternative is SwingUtilities#computeStringWidth(FontMetrics fm, String str)

mKorbel
  • 109,525
  • 20
  • 134
  • 319
4

As a (read: my ;-) general rule, never use the Graphics-level drawString methods. Instead, use a JLabel/CellRendererPane pair to "stamp" the text onto whatever component.

The advantages

  • anti-alias is handled automagically
  • size calculations are done in the labels' bowels, so positioning calculations dont require any low-level methods but simply based on the labels' prefSize
kleopatra
  • 51,061
  • 28
  • 99
  • 211
  • kleopatra +1 :-) welcome back and I hope that this long time was trip around the world :-), thanks for your inputs, – mKorbel Jun 13 '11 at 10:54
  • @mKorbel thanks :-) the "world" was just a small Danish island :-) – kleopatra Jun 13 '11 at 11:01
  • For an example of using a `JLabel` for rendering, see the [LabelRenderTest.java](http://stackoverflow.com/questions/5853879/java-swing-obtain-image-of-jframe/5853992#5853992) source. – Andrew Thompson Jun 13 '11 at 11:45
3

TextLayout, shown here, is another alternative.

Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
  • From your linked example, it seems `TextLayout` is able to accurately calculate the ascent of the text string provided, whereas `FontMetrics` seems to want to account for umlauts & other matters that might not be present. – Andrew Thompson Jun 04 '11 at 08:57
  • 1
    @Andrew Thompson: Good point. `TextLayout` seems to give tighter bounds and works with styled text. Here's a head-to-head [comparison](http://stackoverflow.com/questions/5979795/how-to-calculate-the-number-of-rows-and-columns-in-each-row-a-text-takes-in-a-j/5998117#5998117). – trashgod Jun 04 '11 at 09:10
  • Nothing like a 'shoot it' to help sort the cruft. ;) – Andrew Thompson Jun 04 '11 at 09:34