代码之家  ›  专栏  ›  技术社区  ›  I82Much

Java-最佳库以帮助在任意锚点上绘制文本

  •  3
  • I82Much  · 技术社区  · 15 年前

    我熟悉如何使用各种fontmetrics函数将文本垂直、水平和其他方式居中。但是,我正在寻找一个库,它支持在相对于字符串的给定x y位置绘制文本(例如,我希望字符串的中心位于x、y,或者我希望字符串的右上角位于此处,等等)。

    我找到了 JCommon 它的文本锚定了它的意图,但我很难让它工作,而且 the forum is heretofore unresponsive .

    我知道我可以自己编写所有的实用程序功能,但我希望尽可能避免重新设计轮子。

    3 回复  |  直到 15 年前
        1
  •  1
  •   camickr    15 年前

        2
  •  1
  •   I82Much    15 年前

    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

        3
  •  0
  •   trashgod    15 年前