Wie kann man ein JLabel mit zweifarbigem Hintergrund realisieren?

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

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("Zweifarbiges Label");
        frame.setLayout(new FlowLayout());
        BiColorLabel bcl = new BiColorLabel("label", CENTER, Color.RED,
                Color.BLUE);
        bcl.setPreferredSize(new Dimension(300, 20));
        frame.add(bcl);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        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.