Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将文本字符串添加到矩形2D_Java_String - Fatal编程技术网

Java将文本字符串添加到矩形2D

Java将文本字符串添加到矩形2D,java,string,Java,String,我有一些长方形。给定一个矩形,声明并定义为: Rectangle2D rec = new Rectangle2D.Double(50, 50, 50, 50) 是否可以在此矩形内添加文本字符串? 谢谢您可以在矩形的边界内绘制字符串 Graphics g = ... ... ... String yourString = ... ... ... g.drawString(yourString, rec.getX(), rec.getY()); 使用可能对你有用。不要尝试将字符串装入预定义的矩形

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

Rectangle2D rec = new Rectangle2D.Double(50, 50, 50, 50)
是否可以在此矩形内添加文本字符串?
谢谢

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

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

使用可能对你有用。

不要尝试将字符串装入预定义的矩形,而是考虑使用以找到字符串的边界。

getStringBounds()
方法如下图所示

附录:一旦你知道了边界,就可以更容易地将字符串放在一个更大的矩形中居中,或者将其修剪到合适的位置。通常用于表示省略


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

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);
        }
    }
}
使用的方法是
形状矩形(字符串文本、字体、矩形2D析构图)

例如:


你自己试试

您可能会从绘制
Rectangle2D
组件时使用的
paint(Graphics)
方法中获得它。getGraphics()
否--不要使用Component.getGraphics(),因为获得的图形对象不会持久。请先阅读图形教程,然后再进一步进行此操作。