Java Swing 字体居中显示

 在开发Swing程序的时候,很多情况下为了美观,我们需要将字体水平和垂直居中于某一个控件。

        让我们先来说说居中的算法。其实很简单,将外面控件的长度减去显示内容的长度,然后除以2,这样就得到了放置内容的X坐标。同理,将控件的高度减去内容的高度,然后除以2,就得到了Y坐标。通过X,Y坐标我们就可以在指定点上绘制内容了,这样的算法适用于任何需要居中显示的情况。但是如果需要垂直居中Swing的字体,我们需要小小的变通一下。

        在文章的最后可以下载到我写的例子,让我们结合例子来解释。让我们打开FontComponent类,这个类继承与JComponent,我们在paintComponent方法中来绘制我们的字体。

        首先,我们如何获得外面控件的尺寸呢?在这个例子中,外面的控件就是JFrame的容器Container。在布局管理器的作用下,Swing会将包含各种绘制信息的Graphics2D对象传给paintComponent方法。通过  Rectangle clip = g2.getClipBounds() 这行代码我就可以获取到可以绘制的区域尺寸,即Container容器为FontComponent对象预留的区域。可以通过 clip.width 和 clip.height 属性来获取尺寸的长和高。

        接下来该获取需要绘制的字符串的长度了,请关注如下四行代码:
         Font font = new Font("MS Song", Font.BOLD, 24);
        g2.setFont(font);
FontMetrics fm = g2.getFontMetrics(font);
int textWidth = fm.stringWidth(text);
        我们先创建一个Font对象,这个对象决定了字体的类型,样式和大小。然后将font对象设置给Graphics2D对象,这样我们就能通过 getFontMetrics方法获取到一个 FontMetrics对象,通过它可以计算出在指定字体下,字符串被绘制出来的长度。有了外面控件的长度,有了显示内容的长度,我们可以通过上面提到的算法计算出 X 坐标:int x = (clip.width - textWidth) / 2;

        下面该计算 Y 坐标了,如果绘制的内容是一张图片,那么使用上面的算法就足够了,但是Swing绘制字体的机制比较特别,需要我们稍微调整一下。Swing(确切的说应该是Java2D)在绘制每一行字体的时候,以一条基线为标准来绘制。这样无论字体大小,样式,类型都可以确保在一条直线上。在基线上面的高度叫Ascent,在基线下面的部分叫Descent,如下图:

Java Swing 字体居中显示 - chenchaobox - Tony的博客
 

        所以我们要想获取内容的高度,只要将Ascent高度和Descent的高度相加即可。那么计算 Y 的坐标算法如下:
         int ascent = fm.getAscent();
int descent = fm.getDescent();
int y = (clip.height - (ascent + descent)) / 2 + ascent;
        你可能对最后一行感到疑惑:为什么最后需要加上ascent?别忘了,Java2D绘制字体是从基线开始绘制,我们要做的是,首先是将内容放在垂直居中的位置,然后将 Y 坐标定位到基线的位置,好让Java2D从这里开始绘制。

        FontTest例子 下载
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值