Schriftschatten im JLabel

Galliad

Mitglied
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

Top Contributor
Java:
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

Top Contributor
Java:
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);
    }

}
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
Um die Qualität der Ausgabe zu verbessern kann man noch RenderingHints verwenden,z.B.: ANTIALIASING einschalten
Java:
        final RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHints(rh);
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben