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.