Segue uma imagem do teste que fiz hoje. O resultado foi bem satisfatório.
Pra testar com várias cores de fundo diferentes, coloquei a cor de fundo variando usando um código de um jogo antigo que nunca terminei de fazer.
Eu ia colocar um jnlp aqui mas apanhei pra fazer e desisti hehe. Mas fica aí o código comentado pra quem quiser testar.
Linha 1: Texto usando drawString
Linha 2: Texto usando Shape
Linha 3: Texto usando Shape e contorno usando Stroke.
Linha 4: Texto e contorno usando drawString, o contorno foi deslocando 1 pixel para cima, baixo e laterais.
Linha 5: Texto e contorno usando drawString, o contorno foi deslocando 1 pixel para cima, baixo, laterais e diagonais.
As 5 linhas seguintes é a mesma coisa, porém com anti-aliasing.
![](http://img828.imageshack.us/img828/3994/textos.png)
[code]import java.awt.BasicStroke;
import java.awt.Color;
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 Texto extends JPanel {
private static final long serialVersionUID = 1L;
private int red=255;
private int green=255;
private int blue=1;
public Texto() {
variaCorFundo();
}
public void paint(Graphics g) {
super.paint(g);
Font font = new Font("Tahoma", Font.BOLD, 11);
String texto = "Daniel Fróes Teste de escrita em formato Shape";
Graphics2D g2d = (Graphics2D) g;
g2d.setFont(font);
g2d.setStroke(new BasicStroke(1.0f));
g2d.translate(30, 50);
//Escreve o texto para comparar com o shape
g2d.setPaint(Color.blue);
g2d.drawString(texto, 0, 0);
//Desenha o texto em formato shape sem contorno
g2d.translate(0, 20);
GlyphVector gv = font.createGlyphVector(g2d.getFontRenderContext(),texto);
Shape jshape = gv.getOutline(); // Shape do texto
g2d.setPaint(Color.blue);
g2d.fill(jshape);
//Desenha o texto em formato shape com contorno (STROKE)
g2d.translate(0, 20);
g2d.setPaint(Color.blue);
g2d.fill(jshape);
g2d.setPaint(Color.black);
g2d.draw(jshape);
//Desenha o texto de preto deslocando 1 pixel para cima, baixo, laterais
g2d.translate(0, 20);
g2d.setPaint(Color.black);
g2d.drawString(texto, 0, -1);
g2d.drawString(texto, 0, 1);
g2d.drawString(texto, -1, 0);
g2d.drawString(texto, 1, 0);
g2d.setPaint(Color.blue);
g2d.drawString(texto, 0, 0);
//Desenha o texto de preto deslocando 1 pixel para cima, baixo, laterais e diagonais
g2d.translate(0, 20);
g2d.setPaint(Color.black);
g2d.drawString(texto, 0, -1);
g2d.drawString(texto, 0, 1);
g2d.drawString(texto, -1, 0);
g2d.drawString(texto, 1, 0);
g2d.drawString(texto, -1, -1);
g2d.drawString(texto, -1, 1);
g2d.drawString(texto, 1, -1);
g2d.drawString(texto, 1, 1);
g2d.setPaint(Color.blue);
g2d.drawString(texto, 0, 0);
//Repete os desenhos anteriores com Anti-Aliasing
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.translate(0, 40);
//Escreve o texto para comparar com o shape
g2d.setPaint(Color.blue);
g2d.drawString(texto, 0, 0);
//Desenha o texto em formato shape sem contorno
g2d.translate(0, 20);
g2d.setPaint(Color.blue);
g2d.fill(jshape);
//Desenha o texto em formato shape com contorno (STROKE)
g2d.translate(0, 20);
g2d.setPaint(Color.blue);
g2d.fill(jshape);
g2d.setPaint(Color.black);
g2d.draw(jshape);
//Desenha o texto de preto deslocando 1 pixel para cima, baixo, laterais
g2d.translate(0, 20);
g2d.setPaint(Color.black);
g2d.drawString(texto, 0, -1);
g2d.drawString(texto, 0, 1);
g2d.drawString(texto, -1, 0);
g2d.drawString(texto, 1, 0);
g2d.setPaint(Color.blue);
g2d.drawString(texto, 0, 0);
//Desenha o texto de preto deslocando 1 pixel para cima, baixo, laterais e diagonais
g2d.translate(0, 20);
g2d.setPaint(Color.black);
g2d.drawString(texto, 0, -1);
g2d.drawString(texto, 0, 1);
g2d.drawString(texto, -1, 0);
g2d.drawString(texto, 1, 0);
g2d.drawString(texto, -1, -1);
g2d.drawString(texto, -1, 1);
g2d.drawString(texto, 1, -1);
g2d.drawString(texto, 1, 1);
g2d.setPaint(Color.blue);
g2d.drawString(texto, 0, 0);
}
public void variaCorFundo() {
Thread threadVariaCor = new Thread() {
public void run() {
while(true) {
try {
mudaCorFundo(1);
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
threadVariaCor.start();
}
public void mudaCorFundo(int quantidade) {
for (int i=0;i<quantidade;i++) {
if (red==255&&green<255&&blue==1) green++;
if (red>1&&green==255&&blue==1) red--;
if (red==1&&green==255&&blue<255) blue++;
if (red==1&&green>1&&blue==255) green--;
if (red<255&&green==1&&blue==255) red++;
if (red==255&&green==1&&blue>1) blue--;
}
this.setBackground(new Color(red,green,blue));
}
public static void main(String[] a) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new Texto());
f.setSize(350,350);
f.setVisible(true);
f.setLocationRelativeTo(null);
}
}[/code]