# Schriftschatten im JLabel



## Galliad (23. Jul 2021)

Hallo liebe Community.
Ich habe in meinem Programm aktuell ein JLabel, das kontextabhängig seine Schriftfarbe ändert. Außerdem habe ich eine andere Einstellung, die die Hintergrundfarbe ändert. Da ich sehr viele Kombinationsmöglichkeiten für Schriftfarbe und Hintergrundfarbe habe, ist es einige, in denen die Schrift nicht lesbar ist. Daher würde ich gerne einen Schatten oder eine Outline zu der Schrift hinzufügen. 
Ich habe allerdings bisher noch keine Möglichkeit gefunden das umzusetzen. Hat jemand eine Idee? Ich habe zwar einen Code mit Graphics2D Objekten gefunden, aber der lässt sich nicht wirklich anwenden. 
Ich nutze übrigens Inteliji als IDEA.


----------



## Oneixee5 (23. Jul 2021)

```
public class ShadowText extends JLabel {

    @Override
    public void paint(final Graphics g) {
        final String text = "Hello World!";
        final int x = 10;
        final int y = 70;
        final Font font = new Font("Georgia", Font.ITALIC, 50);
        final Graphics2D g1 = (Graphics2D) g;
        final TextLayout textLayout = new TextLayout(text, font, g1.getFontRenderContext());
        g1.setPaint(new Color(150, 150, 150));
        textLayout.draw(g1, x + 3, y + 3);
        g1.setPaint(Color.BLACK);
        textLayout.draw(g1, x, y);
    }

    public static void main(final String[] args) throws IOException {
        final JFrame f = new JFrame();
        f.add(new ShadowText());
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setSize(350, 150);
        f.setVisible(true);
    }

}
```


----------



## Oneixee5 (23. Jul 2021)

```
public class OutlineText extends JLabel {

    private final String labelText;

    public OutlineText(final String labelText) {
        this.labelText = labelText;
    }

    @Override
    public void paint(final Graphics g) {
        setBackground(Color.white);
        final int w = getSize().width;
        final int h = getSize().height;
        final Graphics2D g2d = (Graphics2D) g;
        final Font font = new Font("Monotype Corsiva", 2, 50);
        final TextLayout textLayout = new TextLayout(this.labelText, font, g2d.getFontRenderContext());
        final Shape shape = textLayout.getOutline(null);
        final Rectangle rect = shape.getBounds();
        final int x = w / 2 - rect.width / 2;
        final int y = h / 2 + rect.height / 2;
        g2d.setPaint(Color.YELLOW);
        textLayout.draw(g2d, x, y);
        final AffineTransform affineTransform = g2d.getTransform();
        affineTransform.translate(x, y);
        g2d.transform(affineTransform);
        g2d.setColor(Color.blue);
        g2d.draw(shape);
        g2d.setClip(shape);
    }

    public static void main(final String[] args) throws IOException {
        final JFrame f = new JFrame();
        f.add(new OutlineText("Hello World!"));
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setSize(350, 150);
        f.setVisible(true);
    }

}
```


----------



## Oneixee5 (23. Jul 2021)

Um die Qualität der Ausgabe zu verbessern kann man noch RenderingHints verwenden,z.B.: ANTIALIASING einschalten

```
final RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHints(rh);
```


----------

