¿Cómo puedo dibujar un contorno alrededor de cualquier texto en AWT, algo similar a esta imagen?¿Cómo dibujar un contorno alrededor del texto en AWT?
Respuesta
dos ejemplos
salida de este pintura sería el BufferedImage
, por AWT Componentes método uso paint()
, por JComponents oscilación es allí paintComponet()
Además, a partir del código vinculado en un comentario:
algunas soluciones más estúpidos: de tipo mismas palabras dos veces, pero uno de ellos es negro y el otro es blanco, poner blanco en la parte superior del uno negro, puede obtener algo similar. -encuentre una fuente que se parece más al ejemplo, y úsela.
muy poco probable que funcione en general, y necesito que se vea bonito. No creo que eso sea lo que MS o Google hacen en sus mapas. –
No estoy seguro de cómo está dibujando el texto ahora, pero una forma en que podría hacerlo es utilizar una Imagen Buffered como una superposición a lo que sea que esté dibujando.
- Crea BufferedImage usando las dimensiones de la cadena y la fuente que deseas dibujar (mira la clase FontMetrics para esto).
- Llene la imagen almacenada con transparencia.
- Dibuje su cadena en la Imagen Buffered con el color que desee.
- Itere sobre cada píxel en la imagen almacenada y vea qué tan lejos está de un píxel del color de su texto. Si está dentro de una cierta distancia, dibuje ese píxel en negro, y tal vez más transparente si está más alejado del color de su texto. Por supuesto, si el píxel ya es del mismo color que el color del texto, ignórelo.
- Dibuja Imagen Buffered en lo que sea que estés pintando.
EDITAR
Puede haber bibliotecas por ahí que ya lo hacen, pero si tuviera que codificar a partir de cero, esto es la forma en que iba a tratar de hacerlo.
Buena idea, definitivamente vale la pena intentarlo. Gracias. –
Aquí está un ejemplo hacky. No es tan sofisticado como otros, pero es más simple de entender, y se comporta como un JLabel.
public class OutlineLabel extends JLabel {
private Color outlineColor = Color.WHITE;
private boolean isPaintingOutline = false;
private boolean forceTransparent = false;
public OutlineLabel() {
super();
}
public OutlineLabel(String text) {
super(text);
}
public OutlineLabel(String text, int horizontalAlignment) {
super(text, horizontalAlignment);
}
public Color getOutlineColor() {
return outlineColor;
}
public void setOutlineColor(Color outlineColor) {
this.outlineColor = outlineColor;
this.invalidate();
}
@Override
public Color getForeground() {
if (isPaintingOutline) {
return outlineColor;
} else {
return super.getForeground();
}
}
@Override
public boolean isOpaque() {
if (forceTransparent) {
return false;
} else {
return super.isOpaque();
}
}
@Override
public void paint(Graphics g) {
String text = getText();
if (text == null || text.length() == 0) {
super.paint(g);
return;
}
// 1 2 3
// 8 9 4
// 7 6 5
if (isOpaque())
super.paint(g);
forceTransparent = true;
isPaintingOutline = true;
g.translate(-1, -1); super.paint(g); // 1
g.translate(1, 0); super.paint(g); // 2
g.translate(1, 0); super.paint(g); // 3
g.translate(0, 1); super.paint(g); // 4
g.translate(0, 1); super.paint(g); // 5
g.translate(-1, 0); super.paint(g); // 6
g.translate(-1, 0); super.paint(g); // 7
g.translate(0, -1); super.paint(g); // 8
g.translate(1, 0); // 9
isPaintingOutline = false;
super.paint(g);
forceTransparent = false;
}
public static void main(String[] args) {
JFrame w = new JFrame();
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
OutlineLabel label = new OutlineLabel("Test", OutlineLabel.CENTER);
label.setOpaque(true);
w.setContentPane(new JPanel(new BorderLayout()));
w.add(label, BorderLayout.CENTER);
w.pack();
w.setVisible(true);
}
}
intente lo siguiente:
public void paintTextWithOutline(Graphics g) {
String text = "some text";
Color outlineColor = Color.white;
Color fillColor = Color.black;
BasicStroke outlineStroke = new BasicStroke(2.0f);
if (g instanceof Graphics2D) {
Graphics2D g2 = (Graphics2D) g;
// remember original settings
Color originalColor = g2.getColor();
Stroke originalStroke = g2.getStroke();
RenderingHints originalHints = g2.getRenderingHints();
// create a glyph vector from your text
GlyphVector glyphVector = getFont().createGlyphVector(g2.getFontRenderContext(), text);
// get the shape object
Shape textShape = glyphVector.getOutline();
// activate anti aliasing for text rendering (if you want it to look nice)
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setColor(outlineColor);
g2.setStroke(outlineStroke);
g2.draw(textShape); // draw outline
g2.setColor(fillColor);
g2.fill(textShape); // fill the shape
// reset to original settings after painting
g2.setColor(originalColor);
g2.setStroke(originalStroke);
g2.setRenderingHints(originalHints);
}
}
- 1. Android dibuja un círculo alrededor del texto
- 2. Algoritmo para dibujar un contorno o trazo alrededor de cualquier imagen transparente alfa
- 3. Crear un halo alrededor del texto en Python usando PIL?
- 4. dibujar un borde alrededor de las subtramas en matplotlib
- 5. CSS: ¿es posible agregar un contorno negro alrededor de cada carácter en el texto?
- 6. Dibujar un sobre alrededor de una curva
- 7. texto Dibujo con el contorno en Java
- 8. Dibujar borde alrededor de un Control en Button_Click
- 9. ¿Cómo dibujar texto en lienzo?
- 10. texto alrededor de un div
- 11. Dibujar texto en ángulo
- 12. Hallando la longitud del contorno en opencv
- 13. ¿Cómo dibujar el borde alrededor de una palabra en RichTextBox?
- 14. Dibujar texto girado en un lienzo HTML5
- 15. ¿Cómo dibujar texto en cuadro de imagen?
- 16. ¿Cómo ajustar texto alrededor de componentes en un JTextPane?
- 17. ¿Cómo se envuelven las correas alrededor del texto?
- 18. Reducir el relleno alrededor del texto en el botón WinForms
- 19. dibujar texto "ellipsized" en un lienzo
- 20. ¿Es posible eliminar un contorno horrible alrededor de un glifo de TSpeedButton?
- 21. ¿Cómo puedo dibujar texto usando Libgdx/Java?
- 22. Java: crea gráficos sin awt?
- 23. iPhone: cómo dibujar texto en una ventana?
- 24. Rectángulo Extracto del Contorno OpenCV
- 25. ¿Dibujar texto en vista circular?
- 26. Cómo dibujar texto en un gráfico de MS ChartArea vacío?
- 27. iPhone - Cómo dibujar texto en medio de un rectángulo
- 28. Dibujar texto en el centro
- 29. Envuelva un lapso de alrededor de un texto en jQuery
- 30. qt dibujar texto colorido
Ver también [esta respuesta] (http://stackoverflow.com/a/6296381/418556) donde (más allá de la especificación) Aplico un borde a la forma del texto. –
Por favor, perdona mi edición. Si no crees que es apropiado para tu respuesta, deshazlo. Pero una imagen pinta más que mil palabras ... o en este caso 'Gato'. ;) –
* "para AWT Components use .." * ..una máquina del tiempo. ¿Por qué siquiera mencionarlos? –