2010-02-17 19 views
3

我熟悉如何使用各種FontMetrics函數垂直,水平和什麼都不居中。然而,我正在尋找一個支持在相對於字符串的給定xy位置繪製文本的庫(例如,我希望字符串的中心位於x,y,或者我希望它的右上角位於此處等等)。 )Java - 最好的庫,以幫助在任意錨點繪製文本

我發現JCommon和它的文字錨點聲稱做到這一點,但我很難得到它的工作和the forum is heretofore unresponsive

我知道我可以自己編寫所有的實用函數,但是我想盡可能避免重新發明輪子。

+1

從部門「遲到總比不到好」,你在論壇中報告的錯誤已被固定爲JCommon 1.0.20版本。另外,對於你想要實現的內容,TextUtilities.drawAlignedString()方法將是最好的選擇。 – 2013-09-01 12:12:00

+0

感謝您的更新。我忘記了這個問題。 – I82Much 2013-09-12 04:10:53

回答

1

完成後必須自己做。代碼如下:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.font.FontRenderContext; 
import java.awt.font.TextLayout; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestFontLayout extends JPanel { 

    public enum AnchorPoint{ 
     UPPER_LEFT, 
     TOP_CENTER, 
     UPPER_RIGHT, 
     RIGHT_CENTER, 
     LOWER_RIGHT, 
     BOTTOM_CENTER, 
     LOWER_LEFT, 
     LEFT_CENTER, 
     CENTER 
    }; 

    public void drawText(TextLayout text, AnchorPoint point, Graphics2D g2, float x, float y) { 
     float translationX = 0.0f; 
     float translationY = 0.0f; 

     Rectangle2D bounds = text.getBounds(); 
     float midYOffset = (float) bounds.getHeight()/2; 
     float midXOffset = (float) -bounds.getWidth()/2; 

     float topYOffset = (float) bounds.getHeight(); 
     float bottomYOffset = 0.0f; 

     float leftXOffset = 0.0f; 
     float rightXOffset = (float) -bounds.getWidth(); 

     // Adjust x values 
     switch (point) { 
      // Left 
      case UPPER_LEFT: 
      case LOWER_LEFT: 
      case LEFT_CENTER: 
       translationX = leftXOffset; 
       break; 
       // Mid 
      case TOP_CENTER: 
      case BOTTOM_CENTER: 
      case CENTER: 
       translationX = midXOffset; 
       break; 
      // Right 
      case UPPER_RIGHT: 
      case RIGHT_CENTER: 
      case LOWER_RIGHT: 
       translationX = rightXOffset; 
     } 

     // Adjust y values 
     switch (point) { 
      // Top 
      case UPPER_LEFT: 
      case UPPER_RIGHT: 
      case TOP_CENTER: 
       translationY = topYOffset; 
       break; 
      // Mid 
      case LEFT_CENTER: 
      case CENTER: 
      case RIGHT_CENTER: 
       translationY = midYOffset; 
       break; 
      // Bottom 
      case LOWER_LEFT: 
      case BOTTOM_CENTER: 
      case LOWER_RIGHT: 
       translationY = bottomYOffset; 
     } 

     text.draw(g2, x + translationX, y + translationY); 

    } 

    public TestFontLayout() { 
     super(); 
     setPreferredSize(new Dimension(400,400)); 
    } 
    @Override 
    public void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     // Ensure that the default painting occurs 
     super.paintComponent(g); 

     Point2D loc = new Point2D.Double(getWidth()/2,getHeight()/2); 
     Font font = Font.decode("Helvetica"); 
     FontRenderContext frc = g2.getFontRenderContext(); 
     TextLayout layout = new TextLayout("This is a string", font, frc); 

     g2.setColor(Color.RED); 
     g2.drawRect(getWidth()/2, getHeight()/2, 1,1); 

     g2.setColor(Color.PINK); 
     drawText(layout, AnchorPoint.UPPER_LEFT, g2, 0, 0); 

     g2.setColor(Color.BLUE); 
     drawText(layout, AnchorPoint.TOP_CENTER, g2, getWidth()/2, 0); 

     g2.setColor(Color.ORANGE); 
     drawText(layout, AnchorPoint.UPPER_RIGHT, g2, getWidth(), 0); 

     g2.setColor(Color.CYAN); 
     drawText(layout, AnchorPoint.RIGHT_CENTER, g2, getWidth(), getHeight()/2); 

     g2.setColor(Color.ORANGE); 
     drawText(layout, AnchorPoint.LOWER_RIGHT, g2, getWidth(), getHeight()); 

     g2.setColor(Color.BLACK); 
     drawText(layout, AnchorPoint.BOTTOM_CENTER, g2, getWidth()/2, getHeight()); 


     g2.setColor(Color.YELLOW); 
     drawText(layout, AnchorPoint.LOWER_LEFT, g2, 0, getHeight()); 

     g2.setColor(Color.DARK_GRAY); 
     drawText(layout, AnchorPoint.LEFT_CENTER, g2, 0, getHeight()/2); 


     g2.setColor(Color.MAGENTA); 
     drawText(layout, AnchorPoint.CENTER, g2, getWidth()/2, getHeight()/2); 
    } 


    public static void main(String[] args) { 
     JFrame frame = new JFrame(""); 
     frame.add(new TestFontLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 

    } 
} 

alt text http://grab.by/2WlM

1

我不知道任何庫,但我猜如果你自己做,你會只使用Graphics.translate()將文本轉換爲相對位置。

+0

絕對可以通過仿射變換進行翻譯。 我會等到看到接下來幾天會有什麼迴應;如果什麼都沒有出現,我會試着潛入JCommons的來源並修復這個錯誤,或者自己寫。 – I82Much 2010-02-17 12:35:28