Я хочу преобразовать какой-то произвольный текст в Shape (java.awt.Shape
), а затем погладить/заполнить форму, чтобы нарисовать ее. Как я могу это сделать?
Java/swing: преобразование текстовой строки в форму
Ответ 1
Hm Я не знал ответа на этот вопрос, но после небольшой настройки и прокрутки с помощью Eclipse-контента я нашел это, похоже, что вам нужно:
EDIT: я изменил код, чтобы изменить способ отображения строки, из-за которой вы спросили, что вы спросили:) Попробуйте. Он отображает строку с красным цветом и пунктирным контуром
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.font.GlyphVector;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JPanel{
private Shape s;
public Test() {
Font f = getFont().deriveFont(Font.BOLD, 70);
GlyphVector v = f.createGlyphVector(getFontMetrics(f).getFontRenderContext(), "Hello");
s = v.getOutline();
setPreferredSize(new Dimension(300,300));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.translate(100, 150);
g2.rotate(0.4);
g2.setPaint(Color.red);
g2.fill(s);
g2.setPaint(Color.black);
g2.setStroke(new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[]{1,0.4f,1.5f}, 0));
g2.draw(s);
}
public static void main(String[] args) {
JFrame f = new JFrame("Test");
Component c = new Test();
f.getContentPane().add(c);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
Также обратите внимание, что вы можете получить отдельные символы из строки, вызвав:
getGlyphOutline(glyphIndex)
Ответ 2
Используйте класс TextLayout (см. метод getOutline()). Вот пример здесь
Ответ 3
Если вы правильно поняли, это не значит, что вы ответите на свой ответ, но это начало...
//Rough pseudo code
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.TexturePaint;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = (Graphics2D)image.getGraphics();
//Paint with texturing brush
Rectangle2D rect2D = new Rectangle2D.Double(0, 0, width, height);
graphics.setPaint(new TexturePaint(image, rect2D));
graphics.fill(rect2D);
//Draw text
graphics.drawString("my text goes here", xPos, yPos);
В резюме,
- Создайте объект
BufferedImage
width
иheight
иImageType
. - Получить изображение
Graphics
. - Покрасьте эту графику, как вам нравится (т.е. создайте прямоугольник, круг, текст и т.д.).
- Запишите это изображение в поток (файл, ServletRequest и т.д.).