Java将文本字符串添加到Rectangle2D

时间:2011-07-21 23:09:15

标签: java string

我有一些矩形。给定一个声明的矩形并定义为:

Rectangle2D rec = new Rectangle2D.Double(50, 50, 50, 50)

是否可以在此矩形内添加一串文字? 感谢

3 个答案:

答案 0 :(得分:3)

不要试图将字符串放入预定义的矩形中,而应考虑使用FontMetrics来查找字符串的边界。 getStringBounds()方法显示在此example中,如下所示。

附录:一旦你知道边界,就可以更容易地将字符串放在一个更大的矩形中或修剪它以适应。 'HORIZONTAL ELLIPSIS' (U+2026)通常用于表示省略。

FrameChars

答案 1 :(得分:2)

您可以在矩形的边界内绘制一个字符串。

Graphics g = ...
...
...
String yourString = ...
...
...
g.drawString(yourString, rec.getX(), rec.getY());

使用FontMetrics可能对您有用。

答案 2 :(得分:0)

您可以使用以下代码通过简单的调整大小方法进行操作:

package org.tw2.adaptedtext;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

/**
 *
 * @author util2
 */
public class Main {
    public static void main(String[] args) {
        ResizedTextFrame rtf = new ResizedTextFrame();        
        rtf.setVisible(true);
    }

    public static class ResizedTextFrame extends JFrame {
        String title = "2D resized text example";
        Font font = new Font("Tahoma", Font.PLAIN, 24);
        Rectangle2D destRect = new Rectangle2D.Double(0, 0, 600, 200);

        Shape textInShape;
        double xText = 0, yText = 0;

        public ResizedTextFrame() throws HeadlessException {
            init();
        }

        private void init(){
            setSize(800, 600);
            setLocationRelativeTo(null); // Force center screen
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // Get a shape for wanted settings
            textInShape = getTextInRectangle(title, font, destRect);
        }

        @Override
        public void paint(Graphics g) {
            // Get a 2D context
            Graphics2D g2d = (Graphics2D)g;

            // Storage
            AffineTransform oldTr = g2d.getTransform();

            // Set the background to white
            g2d.setColor(Color.white);
            g2d.fillRect(0, 0, getWidth(), getHeight());

            //============================================================= Text
            // Settings
            AffineTransform atText = new AffineTransform();
            atText.setToTranslation(150 + xText, 150 + yText + destRect.getHeight());
            g2d.setTransform(atText);
            // Fill the text to red
            g2d.setColor(Color.red);
            g2d.fill(textInShape);
            // Set the text outline to blue
            g2d.setColor(Color.blue);            
            g2d.draw(textInShape);
            // Restore
            g2d.setTransform(oldTr);
            //==================================================================

            //=========================================== Rectangle (boundaries)            
            // Settings
            AffineTransform atRect = new AffineTransform();
            atRect.setToTranslation(150, 150);
            g2d.setTransform(atRect);
            // Draw a rectangle around the text to green
            g2d.setColor(Color.green.darker());
            g2d.draw(destRect);            
            // Restore
            g2d.setTransform(oldTr);
            //==================================================================
        }

        public Shape getTextInRectangle(String text, Font font, Rectangle2D destRectangle){
            // Create a new image to get Graphics2D for measure
            BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = img.createGraphics();

            // Create a FontRenderContext to prepare the calculation of elements of font
            FontRenderContext frc = g2d.getFontRenderContext();

            // Free graphics resources
            g2d.dispose();

            // Set the text
            TextLayout txt = new TextLayout(text, font, frc);

            // Get boundaries of text
            Rectangle2D textBounds = txt.getBounds();

            // Get percents (compare textBounds to destRectangle)
            double percentX = destRectangle.getWidth() / textBounds.getWidth();
            double percentY = destRectangle.getHeight() / textBounds.getHeight();

            // Define an aspect transform
            AffineTransform transform = new AffineTransform();
            transform.setToScale(percentX, percentY);

            //-- Specials settings for location of text ------------------------
            xText = -txt.getBounds().getX() * percentX;
            yText = -txt.getDescent() * percentY;
            //------------------------------------------------------------------

            // Get the shape
            return txt.getOutline(transform);
        }
    }
}

使用的方法是Shape getTextInRectangle(String text, Font font, Rectangle2D destRectangle)

示例: adaptedtext

自己尝试!