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 Konstruktoren, die es ermöglichen, neben dem darzustellenden Text und dessen Ausrichtung zwei Color -Objekte zu übergeben, die den Hintergrund horizontal in zwei verschieden farbige Flächen aufteilen.
Darüber hinaus wird der Übersichtlichkeit halber außer main() nur noch paintComponent() deklariert. Selbstverständlich macht es je nach Verwendung Sinn, noch getter- und setter-Methoden für die Farben und die Ausrichtung zu deklarieren.

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;

public 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 static void main(String[] args) {
        JFrame frame = new JFrame("BiColorLabel");
        frame.setLayout(new FlowLayout());
        BiColorLabel bcl = new BiColorLabel("ene mene muh", CENTER, new Color(255,240, 230),
                new Color(220, 255, 230));
        bcl.setPreferredSize(new Dimension(300, 30));
        frame.add(bcl);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

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.