Java добавить текстовую строку в Rectangle2D - PullRequest
3 голосов
/ 22 июля 2011

У меня есть несколько прямоугольников.Учитывая прямоугольник, объявленный и определенный как:

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

Возможно ли добавить строку текста внутри этого прямоугольника?Спасибо

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Вместо того, чтобы пытаться поместить строку в предварительно определенный прямоугольник, рассмотрите возможность использования FontMetrics, чтобы найти границы строки.Метод getStringBounds() показан в этом примере и проиллюстрирован ниже.

Приложение: Как только вы знаете границы, гораздо проще центрировать строку в большем прямоугольнике или обрезать ее так, чтобы она соответствовала, 'ГОРИЗОНТАЛЬНЫЙ ЭЛЛИПСИС' (U + 2026) обычно используется для подачи сигнала об исключении.

FrameChars

2 голосов
/ 22 июля 2011

Вы можете нарисовать строку в пределах прямоугольника.

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

Использование FontMetrics может оказаться полезным для вас.

0 голосов
/ 10 апреля 2019

Вы можете сделать это простым методом изменения размера, используя этот код:

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

Попробуйте сами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...