Je veux convertir un texte arbitraire en une forme (java.awt.Shape
), puis exécuter/remplir la forme pour la dessiner. Comment puis-je faire ceci?java/swing: conversion d'une chaîne de caractères en une forme
Répondre
Hm, je ne savais pas la réponse à cela, mais après un peaufinage peu et farfouillé avec le contenu Eclipse assiste j'ai trouvé ce qui semble être ce dont vous avez besoin:
EDIT: j'ai changé le code pour changer la façon dont la chaîne est affichée, c'est la raison pour laquelle vous avez demandé ce que vous avez demandé :) Essayez-le. Il rend la chaîne avec la couleur rouge et une note contour en pointillés
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);
}
}
également que vous pouvez obtenir les caractères individuels de la chaîne en appelant:
getGlyphOutline(glyphIndex)
Super - Je l'accepte parce que c'est un exemple complet et compréhensible. Je suis perplexe parce qu'il semble qu'il y ait deux façons de le faire. L'approche GlyphVector que vous avez utilisée et l'approche TextLayout avec laquelle @objects a répondu. Vous ne savez pas quels sont les avantages/désavantages de chacun .... en plus d'une police et d'une chaîne de texte, GlyphVector() semble juste prendre un FontRenderContext, mais TextLayout prend un FontRenderContext et un AffineTransform. –
en effet ... Il serait intéressant d'entendre un employé de Sun (ou quelqu'un d'expérimenté en la matière) sur les différences. Il semble que TextLayout soit utilisé pour de nombreuses opérations liées au glyphe de texte telles que les formes de caret, les caractères de changement ... J'ai d'abord pensé que l'une des deux devait être un nouvel ajout à l'API. API (pour moi et beaucoup c'est la première version assez digne d'être appelée Java: P). –
Si je vous ai bien compris, ce n'est pas pour répondre à votre réponse exacte, mais il est un début ...
//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);
En résumé,
- Créez un objet
BufferedImage
dewidth
etheight
etImageType
. Obtient l'objetGraphics
de l'image. - peinture que les graphiques comme vous s'il vous plaît (à savoir créer un rectangle, cercle, texte, etc.)
- Ecrire cette image à un flux (fichier, ServletRequest, etc.)
Merci, mais je veux rester dans les graphiques vectoriels –
Je suggère que vous devenez plus discret avec votre question alors @Jason S. Nous essayons d'aider, mais nous ne pouvons pas lire ce qui est dans votre esprit. –
?? J'apprécie l'aide, mais ma question a spécifiquement demandé comment convertir le texte en forme, comme dans 'java.awt.Shape'. –
Utilisez la classe TextLayout (voir la méthode getOutline()). Il y a un exemple here
+1: voir mon commentaire sur la réponse de @Sawas –
nos deux réponses sont corrects apparemment ... :) –
cet exemple est un peu plus compact, beaucoup plus propre que la réponse acceptée aussi. http: //www.java2s.com/Code/Java/2D-Graphics-GUI/OutlineFontpaint.htm – planty182
- 1. Conversion d'une chaîne de caractères large en minuscule en C++
- 2. tableau de conversion des paramètres de la forme en chaîne
- 3. Conversion en caractères HTML
- 4. Conversion automatique des caractères échappés en littéraux de chaîne
- 5. Conversion de caractères grecs en Unicode
- 6. Caractères de mise en forme
- 7. Javascript: conversion des caractères spéciaux de la forme% XX% XX?
- 8. ASP.NET La conversion a échoué lors de la conversion d'une chaîne de caractères en identifiant unique
- 9. Conversion de caractères spéciaux en PHP
- 10. conversion de jeu de caractères
- 11. Conversion d'une chaîne C (\ 0 terminée) en une chaîne PHP
- 12. Conversion de caractères ANSI en UTF-8 en Java
- 13. C++ Conversion de la chaîne [4] en une chaîne
- 14. C++ Conversion d'une valeur binaire en octets en une chaîne
- 15. Chaîne de conversion en décimal
- 16. Conversion de chaîne en heure
- 17. Conversion de XPathDocument en chaîne
- 18. chaîne conversion en uint
- 19. Conversion d'une chaîne AnsiString en chaîne Unicode
- 20. Conversion Digits en chaîne
- 21. Conversion de chaîne en temps
- 22. Vérifier la chaîne dans une chaîne de caractères en javascript
- 23. Conversion d'argv en une seule chaîne
- 24. Conversion de byte [] à chaîne
- 25. Conversion de HtmlDocument.DomDocument en chaîne
- 26. Conversion de chaîne en DOM
- 27. Conversion de GUID en chaîne
- 28. Conversion d'une expression Scheme en une chaîne
- 29. Conversion de caractères chinois en Unicode
- 30. Enocde Chaîne de caractères en chaîne Octet?
Je ne sais pas ce que vous voulez dire ici. Peux-tu élaborer? Voulez-vous que le texte devienne la forme des caractères dans le texte? – Holograham