2012-04-04 19 views

Respuesta

6

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:

+0

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. –

+0

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'. ;) –

+0

* "para AWT Components use .." * ..una máquina del tiempo. ¿Por qué siquiera mencionarlos? –

0

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.

+0

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. –

2

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.

  1. Crea BufferedImage usando las dimensiones de la cadena y la fuente que deseas dibujar (mira la clase FontMetrics para esto).
  2. Llene la imagen almacenada con transparencia.
  3. Dibuje su cadena en la Imagen Buffered con el color que desee.
  4. 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.
  5. 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.

+0

Buena idea, definitivamente vale la pena intentarlo. Gracias. –

0

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); 
    } 
} 
0

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); 
    } 
} 
Cuestiones relacionadas