Wie kann man ein JLabel mit zweifarbigem Hintergrund realisieren?

Man erweitert JLabel und überschreibt paintComponent(Graphics g).

JLabel mit zweifarbigem Hintergrund

Die Beispielklasse enthält eine Reihe verketteter Konstruktoren, die es ermöglichen, neben dem darzustellenden Text und dessen Ausrichtung zwei Color-Objekte zu übergeben. Sie färben den Hintergrund horizontal in zwei verschieden farbigen Flächen ein. Selbstverständlich macht es je nach Verwendung Sinn, noch getter- und setter-Methoden für die Farben und die Ausrichtung zu deklarieren, worauf der Übersichtlichkeit halber hier verzichtet wurde.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

class BiColorLabel extends JLabel {

    private Color leftColor, rightColor;
    private String text;
    private int alignment;

    public BiColorLabel(Color leftColor, Color rightColor) {
        this("", LEFT, leftColor, rightColor);
    }

    public BiColorLabel(int alignment, Color leftColor, Color rightColor) {
        this("", alignment, leftColor, rightColor);
    }

    public BiColorLabel(String text, Color leftColor, Color rightColor) {
        this(text, LEFT, leftColor, rightColor);
    }

    public BiColorLabel(String text, int alignment, Color leftColor,
            Color rightColor) {
        super(text);
        this.text = text;
        this.alignment = alignment;
        this.leftColor = leftColor;
        this.rightColor = rightColor;
        updateUI();
    }

    public void paintComponent(Graphics g) {
        if (leftColor == null)
            leftColor = getBackground();
        if (rightColor == null)
            rightColor = getBackground();
        g.setColor(leftColor);
        g.fillRect(0, 0, this.getWidth() / 2, this.getHeight());
        g.setColor(rightColor);
        g.fillRect(this.getWidth() / 2, 0, this.getWidth() / 2,
                this.getHeight());
        g.setColor(Color.BLACK);
        // Grundlinie ermitteln
        FontMetrics fm = this.getFontMetrics(getFont());
        int vPos = this.getHeight() / 2 + fm.getHeight() / 2 - fm.getDescent();
        if (alignment == SwingConstants.RIGHT) {
            g.drawString(text, this.getWidth() - fm.stringWidth(text), vPos);
        } else if (alignment == SwingConstants.CENTER) {
            g.drawString(text, this.getWidth() / 2 - fm.stringWidth(text) / 2,
                    vPos);
        } else {
            g.drawString(text, 0, vPos);
        }
    }
}

public class BiColorLabelBsp {
    
    public BiColorLabelBsp() {
        init();
    }
    
    private void init() {
        JFrame frame = new JFrame("BiColorLabel");
        frame.setLayout(new FlowLayout());
        BiColorLabel bcl = new BiColorLabel("ene mene muh", SwingConstants.CENTER, new Color(255,240, 230),
                new Color(220, 255, 230));
        bcl.setPreferredSize(new Dimension(300, 30));
        frame.add(bcl);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new BiColorLabelBsp());
    }
}

In paintComponent() werden zunächst mit beiden Farben je ein linkes und ein rechtes Rechteck gezeichnet. Auf diese wird dann der Text gesetzt. Dies geschieht durch Errechnung der Textfläche und die Positionierung abhängig von der Ausrichtung. Bei der Abänderung des Programms sollte darauf geachtet werden, dass sich die vertikale Positionierung des Textes nach dessen Grundlinie richtet.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.