Wie kann ich einen Umriss um irgendeinen Text in AWT zeichnen, etwas ähnliches zu diesem Bild?Wie zeichne ich einen Umriss um Text in AWT?
Antwort
zwei Beispiele
Ausgabe dieser Farbe würde die BufferedImage
, für AWT-Komponenten verwenden Methode paint()
, für Swing JComponents sein ist es paintComponet()
von Code in einem Kommentar verknüpft:
einige dümmste Abhilfen: -Typ gleichen Worte zweimal aber einer von ihnen ist schwarz und die andere weiß ist, oben auf dem schwarzen setzen weiß, können Sie etwas ähnliches bekommen. -Finden Sie eine Schriftart, die über dem Beispiel aussieht, und verwenden Sie sie.
Sehr unwahrscheinlich, im Allgemeinen zu arbeiten und ich brauche es schön aussehen. Ich glaube nicht, dass MS oder Google dies in ihren Karten tun. –
Nicht sicher, wie Sie den Text jetzt zeichnen, aber eine Möglichkeit, wie Sie es tun können, ist ein BufferedImage als Overlay zu dem, was Sie gerade zeichnen.
- Erstellen Sie BufferedImage mit den Dimensionen der Zeichenkette und Schriftart, mit der Sie zeichnen möchten (sehen Sie sich die FontMetrics-Klasse an).
- Füllen Sie BufferedImage mit Transparenz.
- Zeichnen Sie Ihre Zeichenfolge auf die BufferedImage mit der gewünschten Farbe.
- Iterieren Sie über jedes Pixel in BufferedImage und sehen Sie, wie weit es von einem Pixel der Textfarbe entfernt ist. Wenn es sich in einer bestimmten Entfernung befindet, zeichne dieses Pixel schwarz und vielleicht transparenter, wenn es weiter von der Farbe deines Textes entfernt ist. Wenn das Pixel bereits die gleiche Farbe wie Ihre Textfarbe hat, ignorieren Sie es.
- Zeichnen Sie BufferedImage auf was auch immer Sie malen.
EDIT
Es Bibliotheken da draußen sein kann, dass dies bereits tun, aber wenn ich es von Grund auf neu zu codieren hatte, das ist, wie ich es tun würde versuchen.
Nette Idee, definitiv einen Versuch wert. Vielen Dank. –
Hier ist ein Hacky Beispiel. Es ist nicht so raffiniert wie andere, aber es ist einfacher zu verstehen, und es verhält sich wie ein 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);
}
}
Versuchen Sie Folgendes:
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);
}
}
Siehe auch [diese Antwort] (http://stackoverflow.com/a/6296381/418556) wo (über die Spezifikation hinaus) ich einen Rahmen an die Form des Textes anwende. –
Bitte verzeih meine Bearbeitung. Wenn Sie nicht denken, dass es für Ihre Antwort geeignet ist, rollen Sie es zurück. Aber ein Bild sagt mehr als tausend Worte, oder in diesem Fall "Katze". ;) –
* "für AWT Komponenten verwenden .." * ..eine Zeitmaschine. Warum sollte man sie überhaupt erwähnen? –