Swing 繪製居中文字

<p>Java Swing 字體居中顯示&#160; </p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 在開發Swing程序的時候,不少狀況下爲了美觀,咱們須要將字體水平和垂直居中於某一個控件。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 讓咱們先來講說居中的算法。其實很簡單,將外面控件的長度減去顯示內容的長度,而後除以2,這樣就獲得了放置內容的X座標。同理,將控件的高度減去內容的高度,而後除以2,就獲得了Y座標。經過X,Y座標咱們就能夠在指定點上繪製內容了,這樣的算法適用於任何須要居中顯示的狀況。可是若是須要垂直居中Swing的字體,咱們須要小小的變通一下。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 在文章的最後能夠下載到我寫的例子,讓咱們結合例子來解釋。讓咱們打開FontComponent類,這個類繼承與JComponent,咱們在paintComponent方法中來繪製咱們的字體。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 首先,咱們如何得到外面控件的尺寸呢?在這個例子中,外面的控件就是JFrame的容器Container。在佈局管理器的做用下,Swing會將包含各類繪製信息的Graphics2D對象傳給paintComponent方法。經過 Rectangle clip = g2.getClipBounds() 這行代碼我就能夠獲取到能夠繪製的區域尺寸,即Container容器爲FontComponent對象預留的區域。能夠經過 clip.width 和 clip.height 屬性來獲取尺寸的長和高。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 接下來該獲取須要繪製的字符串的長度了,請關注以下四行代碼: <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Font font = new Font(&quot;MS Song&quot;, Font.BOLD, 24); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; g2.setFont(font); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; FontMetrics fm = g2.getFontMetrics(font);&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int textWidth = fm.stringWidth(text); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 咱們先建立一個Font對象,這個對象決定了字體的類型,樣式和大小。而後將font對象設置給Graphics2D對象,這樣咱們就能經過getFontMetrics方法獲取到一個FontMetrics對象,經過它能夠計算出在指定字體下,字符串被繪製出來的長度。有了外面控件的長度,有了顯示內容的長度,咱們能夠經過上面提到的算法計算出 X 座標:int x = (clip.width - textWidth) / 2;</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 下面該計算 Y 座標了,若是繪製的內容是一張圖片,那麼使用上面的算法就足夠了,可是Swing繪製字體的機制比較特別,須要咱們稍微調整一下。Swing(確切的說應該是Java2D)在繪製每一行字體的時候,以一條基線爲標準來繪製。這樣不管字體大小,樣式,類型均可以確保在一條直線上。在基線上面的高度叫Ascent,在基線下面的部分叫Descent。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 因此咱們要想獲取內容的高度,只要將Ascent高度和Descent的高度相加便可。那麼計算 Y 的座標算法以下: <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int ascent = fm.getAscent(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int descent = fm.getDescent(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int y = (clip.height - (ascent + descent)) / 2 + ascent; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; 你可能對最後一行感到疑惑:爲何最後須要加上ascent?別忘了,Java2D繪製字體是從基線開始繪製,咱們要作的是,首先是將內容放在垂直居中的位置,而後將 Y 座標定位到基線的位置,好讓Java2D從這裏開始繪製。 </p>算法

相關文章
相關標籤/搜索