下面列出了java.awt.FontMetrics#getAscent ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Initialise the font to be used based on configuration
*
* @param baseFont The AWT font to render
* @param size The point size of the font to generated
* @param bold True if the font should be rendered in bold typeface
* @param italic True if the font should be rendered in bold typeface
*/
private void initializeFont(Font baseFont, int size, boolean bold, boolean italic) {
Map attributes = baseFont.getAttributes();
attributes.put(TextAttribute.SIZE, new Float(size));
attributes.put(TextAttribute.WEIGHT, bold ? TextAttribute.WEIGHT_BOLD : TextAttribute.WEIGHT_REGULAR);
attributes.put(TextAttribute.POSTURE, italic ? TextAttribute.POSTURE_OBLIQUE : TextAttribute.POSTURE_REGULAR);
try {
attributes.put(TextAttribute.class.getDeclaredField("KERNING").get(null), TextAttribute.class.getDeclaredField(
"KERNING_ON").get(null));
} catch (Exception ignored) {
}
font = baseFont.deriveFont(attributes);
FontMetrics metrics = GlyphPage.getScratchGraphics().getFontMetrics(font);
ascent = metrics.getAscent();
descent = metrics.getDescent();
leading = metrics.getLeading();
// Determine width of space glyph (getGlyphPixelBounds gives a width of zero).
char[] chars = " ".toCharArray();
GlyphVector vector = font.layoutGlyphVector(GlyphPage.renderContext, chars, 0, chars.length, Font.LAYOUT_LEFT_TO_RIGHT);
spaceWidth = vector.getGlyphLogicalBounds(0).getBounds().width;
}
static void paintPlaceholder( Graphics g, JTextComponent c, Color placeholderForeground ) {
// check whether text component is empty
if( c.getDocument().getLength() > 0 )
return;
// check for JComboBox
Container parent = c.getParent();
JComponent jc = (parent instanceof JComboBox) ? (JComboBox<?>) parent : c;
// get placeholder text
Object placeholder = jc.getClientProperty( FlatClientProperties.PLACEHOLDER_TEXT );
if( !(placeholder instanceof String) )
return;
// compute placeholder location
Insets insets = c.getInsets();
FontMetrics fm = c.getFontMetrics( c.getFont() );
int x = insets.left;
int y = insets.top + fm.getAscent() + ((c.getHeight() - insets.top - insets.bottom - fm.getHeight()) / 2);
// paint placeholder
g.setColor( placeholderForeground );
FlatUIUtils.drawString( c, g, (String) placeholder, x, y );
}
private Rectangle getCaretRectangle(TextHitInfo caret) {
int caretLocation = 0;
TextLayout layout = composedTextLayout;
if (layout != null) {
caretLocation = Math.round(layout.getCaretInfo(caret)[0]);
}
Graphics g = getGraphics();
FontMetrics metrics = null;
try {
metrics = g.getFontMetrics();
} finally {
g.dispose();
}
return new Rectangle(TEXT_ORIGIN_X + caretLocation,
TEXT_ORIGIN_Y - metrics.getAscent(),
0, metrics.getAscent() + metrics.getDescent());
}
/**
* Reinitialize the insets parameter with this Border's current Insets.
* @param c the component for which this border insets value applies
* @param insets the object to be reinitialized
*/
public Insets getBorderInsets(Component c, Insets insets) {
if (!(c instanceof JPopupMenu)) {
return insets;
}
FontMetrics fm;
int descent = 0;
int ascent = 16;
String title = ((JPopupMenu)c).getLabel();
if (title == null) {
insets.left = insets.top = insets.right = insets.bottom = 0;
return insets;
}
fm = c.getFontMetrics(font);
if(fm != null) {
descent = fm.getDescent();
ascent = fm.getAscent();
}
insets.top += ascent + descent + TEXT_SPACING + GROOVE_HEIGHT;
return insets;
}
/**
* Returns the bounds for the specified text.
*
* @param text the text (<code>null</code> permitted).
* @param g2 the graphics context (not <code>null</code>).
* @param fm the font metrics (not <code>null</code>).
*
* @return The text bounds (<code>null</code> if the <code>text</code>
* argument is <code>null</code>).
*/
public static Rectangle2D getTextBounds(String text, Graphics2D g2,
FontMetrics fm) {
Rectangle2D bounds;
if (TextUtilities.useFontMetricsGetStringBounds) {
bounds = fm.getStringBounds(text, g2);
// getStringBounds() can return incorrect height for some Unicode
// characters...see bug parade 6183356, let's replace it with
// something correct
LineMetrics lm = fm.getFont().getLineMetrics(text,
g2.getFontRenderContext());
bounds.setRect(bounds.getX(), bounds.getY(), bounds.getWidth(),
lm.getHeight());
}
else {
double width = fm.stringWidth(text);
double height = fm.getHeight();
if (logger.isDebugEnabled()) {
logger.debug("Height = " + height);
}
bounds = new Rectangle2D.Double(0.0, -fm.getAscent(), width,
height);
}
return bounds;
}
/**
* Reinitialize the insets parameter with this Border's current Insets.
* @param c the component for which this border insets value applies
* @param insets the object to be reinitialized
*/
public Insets getBorderInsets(Component c, Insets insets) {
if (!(c instanceof JPopupMenu)) {
return insets;
}
FontMetrics fm;
int descent = 0;
int ascent = 16;
String title = ((JPopupMenu)c).getLabel();
if (title == null) {
insets.left = insets.top = insets.right = insets.bottom = 0;
return insets;
}
fm = c.getFontMetrics(font);
if(fm != null) {
descent = fm.getDescent();
ascent = fm.getAscent();
}
insets.top += ascent + descent + TEXT_SPACING + GROOVE_HEIGHT;
return insets;
}
private static int draw(Graphics2D gc, String text, int y, int right, boolean addGap, boolean onLeft) {
String[] one = text.split("\n");
FontMetrics fm = gc.getFontMetrics();
int fHeight = fm.getAscent() + fm.getDescent();
for (int i = one.length - 1; i >= 0; i--) {
gc.drawString(one[i], onLeft ? HMARGIN : right - fm.stringWidth(one[i]), y);
y -= fHeight;
}
if (addGap) {
y -= fHeight / 2;
}
return y;
}
/**
* Renders the text using an optional drop shadow.
*/
private void paintText(Graphics2D g, int w, int h) {
g.setFont(getFont());
String text = getHeapSizeText();
FontMetrics fm = g.getFontMetrics();
int textWidth = fm.stringWidth(text);
int x = (w - maxTextWidth) / 2 + (maxTextWidth - textWidth);
int y = h / 2 + fm.getAscent() / 2 - 2;
g.setColor(TEXT_COLOR);
g.drawString(text, x, y);
}
/**
* @param g -
* The graphic context for the drawing operation.
* @param string -
* The String to be rendered.
* @param x -
* The x coordinate where the String should be positioned.
* @param y -
* The y coordinate where the String should be positioned. NOTE: The text is <b>centered </b> over the given coordinates.
*/
protected void paintToolTipText(Graphics g, String string, int x, int y) {
g.setFont(this.getFont());
FontMetrics fontMetrics = g.getFontMetrics();
int a = fontMetrics.getAscent();
int h = a + fontMetrics.getDescent();
int w = fontMetrics.stringWidth(string);
int xPosition = x - (w / 2);
int yPosition = y - (h / 2);
// Draw the background
Color c = this.getColor();
g.setColor(c);
int r = h / 2;
int vPad = h / 8;
int hPad = h / 4;
g.fillRoundRect(xPosition - hPad, yPosition - vPad, w + (2 * hPad), h
+ (2 * vPad), r, r);
//Draw a defined edge to the popup
g.setColor(TMTopicNode.textColourForBackground(c));
g.drawRoundRect(xPosition - hPad, yPosition - vPad, w + (2 * hPad), h
+ (2 * vPad), r, r);
// Draw the text
g.drawString(string, xPosition, yPosition + a);
}
@Override
public Dimension getPreferredSize(JComponent c) {
FontMetrics fm = getTxtFontMetrics();
int height = fm == null ?
21 : fm.getAscent() + 2 * fm.getDescent() + 4;
Insets insets = c.getInsets();
prefSize.height = height + insets.bottom + insets.top;
return prefSize;
}
protected int getMarkSize(Graphics g){
if (g != null){
FontMetrics fm = g.getFontMetrics(getColoring().getFont());
if (fm != null){
int ret = fm.getAscent() - fm.getDescent();
return ret - ret%2;
}
}
return -1;
}
/**
* Paints the label text with the foreground color, if the label is opaque
* then paints the entire background with the background color. The Label
* text is drawn by {@link #paintEnabledText} or {@link #paintDisabledText}.
* The locations of the label parts are computed by {@link #layoutCL}.
*
* @see #paintEnabledText
* @see #paintDisabledText
* @see #layoutCL
*/
public void paint(Graphics g, JComponent c)
{
JLabel label = (JLabel)c;
String text = label.getText();
Icon icon = (label.isEnabled()) ? label.getIcon() : label.getDisabledIcon();
if ((icon == null) && (text == null)) {
return;
}
FontMetrics fm = SwingUtilities2.getFontMetrics(label, g);
String clippedText = layout(label, fm, c.getWidth(), c.getHeight());
if (icon != null) {
icon.paintIcon(c, g, paintIconR.x, paintIconR.y);
}
if (text != null) {
View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
v.paint(g, paintTextR);
} else {
int textX = paintTextR.x;
int textY = paintTextR.y + fm.getAscent();
if (label.isEnabled()) {
paintEnabledText(label, g, clippedText, textX, textY);
}
else {
paintDisabledText(label, g, clippedText, textX, textY);
}
}
}
}
private int getXPadding( final boolean fromBottom, final FontMetrics fontMetrics, final Rectangle2D bounds ) {
if ( ElementAlignment.CENTER.equals( hAlign ) ) {
return (int) ( bounds.getWidth() / 2 );
}
if ( ElementAlignment.LEFT.equals( hAlign ) || ElementAlignment.JUSTIFY.equals( hAlign ) ) {
return fromBottom ? fontMetrics.getAscent() : fontMetrics.getDescent();
}
if ( ElementAlignment.RIGHT.equals( hAlign ) ) {
return (int) ( bounds.getWidth() - ( fromBottom ? fontMetrics.getDescent() : fontMetrics.getAscent() ) );
}
return 0;
}
@Override
public Dimension getPreferredSize(JComponent c) {
FontMetrics fm = getTxtFontMetrics();
int height = fm == null ?
21 : fm.getAscent() + 2 * fm.getDescent() + 3;
height += 1; //align with editor tabs
Insets insets = c.getInsets();
prefSize.height = height + insets.bottom + insets.top;
return prefSize;
}
/**
*
* @param g
* @param text
* @param cX
* @param cY
* @return
*/
public Point2f getTextPoint(Graphics g, String text, double cX, double cY) {
FontMetrics metrics = g.getFontMetrics();
Rectangle2D stringBounds = metrics.getStringBounds(text, g);
double halfWidth = stringBounds.getWidth() / 2;
double halfHeight = stringBounds.getHeight() / 2;
double ascent = metrics.getAscent();
float x = (float) (cX - halfWidth);
float y = (float) (cY - halfHeight + ascent);
return new Point2f(x, y);
}
/**
* Paints the border for the specified component with the
* specified position and size.
* @param c the component for which this border is being painted
* @param g the paint graphics
* @param x the x position of the painted border
* @param y the y position of the painted border
* @param width the width of the painted border
* @param height the height of the painted border
*/
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
if (!(c instanceof JPopupMenu)) {
return;
}
Font origFont = g.getFont();
Color origColor = g.getColor();
JPopupMenu popup = (JPopupMenu)c;
String title = popup.getLabel();
if (title == null) {
return;
}
g.setFont(font);
FontMetrics fm = SwingUtilities2.getFontMetrics(popup, g, font);
int fontHeight = fm.getHeight();
int descent = fm.getDescent();
int ascent = fm.getAscent();
Point textLoc = new Point();
int stringWidth = SwingUtilities2.stringWidth(popup, fm,
title);
textLoc.y = y + ascent + TEXT_SPACING;
textLoc.x = x + ((width - stringWidth) / 2);
g.setColor(background);
g.fillRect(textLoc.x - TEXT_SPACING, textLoc.y - (fontHeight-descent),
stringWidth + (2 * TEXT_SPACING), fontHeight - descent);
g.setColor(foreground);
SwingUtilities2.drawString(popup, g, title, textLoc.x, textLoc.y);
MotifGraphicsUtils.drawGroove(g, x, textLoc.y + TEXT_SPACING,
width, GROOVE_HEIGHT,
shadowColor, highlightColor);
g.setFont(origFont);
g.setColor(origColor);
}
/**
* Also paints the labels of the Y axis and assist lines.
*/
@Override
protected void paintAxesLabels() {
// X (time) axis
super.paintAxesLabels();
// Y axis
final int assistLinesCount = drawingRect.height < ASSIST_LINES_MIN_DISTANCE ? 1 : drawingRect.height / ASSIST_LINES_MIN_DISTANCE;
final Stroke oldStroke = g.getStroke();
g.setStroke( STROKE_DASHED );
// Calculate appropriate font so value labels will fit
Font oldFont = null;
if ( valueMax > 9999 ) {
// Max value is 5 digit (at least), decrease the font size
oldFont = g.getFont();
g.setFont( oldFont.deriveFont( 9f ) );
} else if ( valueMax > 999 ) {
// Max value is 4 digit (at least), decrease the font size
oldFont = g.getFont();
g.setFont( oldFont.deriveFont( 10f ) );
}
final FontMetrics fontMetrics = g.getFontMetrics();
final int fontAscent = fontMetrics.getAscent();
for ( int i = assistLinesCount - 1; i >= 0; i-- ) {
final int y = drawingRect.y1 + i * drawingRect.dy / assistLinesCount; // assistLinesCount > 0
g.setColor( COLOR_ASSIST_LINES );
g.drawLine( drawingRect.x1 + 1, y, drawingRect.x2, y );
g.setColor( COLOR_AXIS_LABELS );
final String label = Integer.toString( valueMax * ( assistLinesCount - i ) / assistLinesCount );
g.drawString( label, drawingRect.x1 - fontMetrics.stringWidth( label ) - 1, y + fontAscent / 2 - 1 );
}
if ( oldFont != null )
g.setFont( oldFont );
g.setStroke( oldStroke );
}
public void drawCenterString(String s, int x, int y) {
FontMetrics fontmetrics = g2d.getFontMetrics();
x -= fontmetrics.stringWidth(s) >> 1;
y += fontmetrics.getAscent() - fontmetrics.getDescent() >> 1;
g2d.drawString(s, x, y);
}
/**
* Paints the border for the specified component with the
* specified position and size.
* @param c the component for which this border is being painted
* @param g the paint graphics
* @param x the x position of the painted border
* @param y the y position of the painted border
* @param width the width of the painted border
* @param height the height of the painted border
*/
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
if (!(c instanceof JPopupMenu)) {
return;
}
Font origFont = g.getFont();
Color origColor = g.getColor();
JPopupMenu popup = (JPopupMenu)c;
String title = popup.getLabel();
if (title == null) {
return;
}
g.setFont(font);
FontMetrics fm = SwingUtilities2.getFontMetrics(popup, g, font);
int fontHeight = fm.getHeight();
int descent = fm.getDescent();
int ascent = fm.getAscent();
Point textLoc = new Point();
int stringWidth = SwingUtilities2.stringWidth(popup, fm,
title);
textLoc.y = y + ascent + TEXT_SPACING;
textLoc.x = x + ((width - stringWidth) / 2);
g.setColor(background);
g.fillRect(textLoc.x - TEXT_SPACING, textLoc.y - (fontHeight-descent),
stringWidth + (2 * TEXT_SPACING), fontHeight - descent);
g.setColor(foreground);
SwingUtilities2.drawString(popup, g, title, textLoc.x, textLoc.y);
MotifGraphicsUtils.drawGroove(g, x, textLoc.y + TEXT_SPACING,
width, GROOVE_HEIGHT,
shadowColor, highlightColor);
g.setFont(origFont);
g.setColor(origColor);
}
/**
* {@inheritDoc}
*/
@Override
public int getBaseline(JComponent c, int width, int height) {
if (c == null) {
throw new NullPointerException("Component must be non-null");
}
if (width < 0 || height < 0) {
throw new IllegalArgumentException(
"Width and height must be >= 0");
}
JLabel label = (JLabel)c;
String text = label.getText();
if (text == null || "".equals(text)) {
return -1;
}
Insets i = label.getInsets();
Rectangle viewRect = new Rectangle();
Rectangle textRect = new Rectangle();
Rectangle iconRect = new Rectangle();
viewRect.x = i.left;
viewRect.y = i.top;
viewRect.width = width - (i.right + viewRect.x);
viewRect.height = height - (i.bottom + viewRect.y);
// layout the text and icon
SynthContext context = getContext(label);
FontMetrics fm = context.getComponent().getFontMetrics(
context.getStyle().getFont(context));
context.getStyle().getGraphicsUtils(context).layoutText(
context, fm, label.getText(), label.getIcon(),
label.getHorizontalAlignment(), label.getVerticalAlignment(),
label.getHorizontalTextPosition(), label.getVerticalTextPosition(),
viewRect, iconRect, textRect, label.getIconTextGap());
View view = (View)label.getClientProperty(BasicHTML.propertyKey);
int baseline;
if (view != null) {
baseline = BasicHTML.getHTMLBaseline(view, textRect.width,
textRect.height);
if (baseline >= 0) {
baseline += textRect.y;
}
}
else {
baseline = textRect.y + fm.getAscent();
}
context.dispose();
return baseline;
}