<p>Java Swing 字体居中显示  </p> <p>        在开发Swing程序的时候,不少状况下为了美观,咱们须要将字体水平和垂直居中于某一个控件。</p> <p>        让咱们先来讲说居中的算法。其实很简单,将外面控件的长度减去显示内容的长度,而后除以2,这样就获得了放置内容的X坐标。同理,将控件的高度减去内容的高度,而后除以2,就获得了Y坐标。经过X,Y坐标咱们就能够在指定点上绘制内容了,这样的算法适用于任何须要居中显示的状况。可是若是须要垂直居中Swing的字体,咱们须要小小的变通一下。</p> <p>        在文章的最后能够下载到我写的例子,让咱们结合例子来解释。让咱们打开FontComponent类,这个类继承与JComponent,咱们在paintComponent方法中来绘制咱们的字体。</p> <p>        首先,咱们如何得到外面控件的尺寸呢?在这个例子中,外面的控件就是JFrame的容器Container。在布局管理器的做用下,Swing会将包含各类绘制信息的Graphics2D对象传给paintComponent方法。经过 Rectangle clip = g2.getClipBounds() 这行代码我就能够获取到能够绘制的区域尺寸,即Container容器为FontComponent对象预留的区域。能够经过 clip.width 和 clip.height 属性来获取尺寸的长和高。</p> <p>        接下来该获取须要绘制的字符串的长度了,请关注以下四行代码: <br />        Font font = new Font("MS Song", Font.BOLD, 24); <br />        g2.setFont(font); <br />        FontMetrics fm = g2.getFontMetrics(font);  <br />        int textWidth = fm.stringWidth(text); <br />        咱们先建立一个Font对象,这个对象决定了字体的类型,样式和大小。而后将font对象设置给Graphics2D对象,这样咱们就能经过getFontMetrics方法获取到一个FontMetrics对象,经过它能够计算出在指定字体下,字符串被绘制出来的长度。有了外面控件的长度,有了显示内容的长度,咱们能够经过上面提到的算法计算出 X 坐标:int x = (clip.width - textWidth) / 2;</p> <p>        下面该计算 Y 坐标了,若是绘制的内容是一张图片,那么使用上面的算法就足够了,可是Swing绘制字体的机制比较特别,须要咱们稍微调整一下。Swing(确切的说应该是Java2D)在绘制每一行字体的时候,以一条基线为标准来绘制。这样不管字体大小,样式,类型均可以确保在一条直线上。在基线上面的高度叫Ascent,在基线下面的部分叫Descent。</p> <p>        因此咱们要想获取内容的高度,只要将Ascent高度和Descent的高度相加便可。那么计算 Y 的坐标算法以下: <br />        int ascent = fm.getAscent(); <br />        int descent = fm.getDescent(); <br />        int y = (clip.height - (ascent + descent)) / 2 + ascent; <br />        你可能对最后一行感到疑惑:为何最后须要加上ascent?别忘了,Java2D绘制字体是从基线开始绘制,咱们要作的是,首先是将内容放在垂直居中的位置,而后将 Y 坐标定位到基线的位置,好让Java2D从这里开始绘制。 </p>算法