Wie kann man ein JLabel
mit zweifarbigem
Hintergrund realisieren?
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.