我熟悉如何使用各種FontMetrics函數垂直,水平和什麼都不居中。然而,我正在尋找一個支持在相對於字符串的給定xy位置繪製文本的庫(例如,我希望字符串的中心位於x,y,或者我希望它的右上角位於此處等等)。 )Java - 最好的庫,以幫助在任意錨點繪製文本
我發現JCommon和它的文字錨點聲稱做到這一點,但我很難得到它的工作和the forum is heretofore unresponsive。
我知道我可以自己編寫所有的實用函數,但是我想盡可能避免重新發明輪子。
我熟悉如何使用各種FontMetrics函數垂直,水平和什麼都不居中。然而,我正在尋找一個支持在相對於字符串的給定xy位置繪製文本的庫(例如,我希望字符串的中心位於x,y,或者我希望它的右上角位於此處等等)。 )Java - 最好的庫,以幫助在任意錨點繪製文本
我發現JCommon和它的文字錨點聲稱做到這一點,但我很難得到它的工作和the forum is heretofore unresponsive。
我知道我可以自己編寫所有的實用函數,但是我想盡可能避免重新發明輪子。
完成後必須自己做。代碼如下:
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);
}
}
我不知道任何庫,但我猜如果你自己做,你會只使用Graphics.translate()將文本轉換爲相對位置。
絕對可以通過仿射變換進行翻譯。 我會等到看到接下來幾天會有什麼迴應;如果什麼都沒有出現,我會試着潛入JCommons的來源並修復這個錯誤,或者自己寫。 – I82Much 2010-02-17 12:35:28
您可能會看到TextLayout
。 draw()
和getBounds()
方法可以簡化編碼。
從部門「遲到總比不到好」,你在論壇中報告的錯誤已被固定爲JCommon 1.0.20版本。另外,對於你想要實現的內容,TextUtilities.drawAlignedString()方法將是最好的選擇。 – 2013-09-01 12:12:00
感謝您的更新。我忘記了這個問題。 – I82Much 2013-09-12 04:10:53