Hallo,
ich versuch gerade ein JLabel in Pfeilform zu entwickeln.
Dazu habe ich mir eine Klasse geschrieben, die die Pfeile zeichnet:
danach erstelle ich mein Label wie folgt:
ist das richtig so, oder vertoße ich da gegen irgendwelche Regeln?!
Mein Programm wift jetzt 2 Probleme auf:
1. wenn ich mein Polygon fülle, dann geht mein schöner Rahmen verloren weil die Füllung den Rahmen an manchen Stellen überlagert. Das sieht schrecklich aus. Kann man das verhindern?
2. ich möchte mein JLabel nun so umschreiben, dass setHorizontalAlignment(JLabel.CENTER) den Text und / oder das Icon nun nicht mehr genau mittig platziert sondern leicht versetzt (je nach Pfeilspitze).
Ich kriegs einfach nicht auf die Reihe! Hab mir schon den Source von JLabel, JComponent, Container und Component durchgesehen.
Hab schon probiert, in der paint()-Methode vor super.paint() ein setBounds zu setzen. Hab auch schon probiert die setAlignmentX Methode zu überschreiben. Nichts hilft! Wisst ihr da weiter?!
mfg, guni
ich versuch gerade ein JLabel in Pfeilform zu entwickeln.
Dazu habe ich mir eine Klasse geschrieben, die die Pfeile zeichnet:
Java:
class Arrow extends Polygon
{
private static final long serialVersionUID = 1L;
public static final int NOARROW = 1;
public static final int LEFTARROW = 2;
public static final int RIGHTARROW = 3;
public static final int BOTHARROWS = 4;
private int x;
private int y;
private int w;
private int h;
private double angle;
private int ht;
private Arrow()
{
super();
}
public Arrow(int peekangle, Rectangle bounds, int mode)
{
this();
x = bounds.x;
y = bounds.y;
w = bounds.width;
h = bounds.height;
angle = Math.toRadians(peekangle);
ht = (int) ((h/2) / Math.tan(angle/2));
switch (mode)
{
case LEFTARROW:
leftarrow();
break;
case RIGHTARROW:
rightarrow();
break;
case BOTHARROWS:
botharrows();
break;
default:
noarrow();
break;
}
}
private void leftarrow()
{
addPoint(x, y);
addPoint(w, y);
addPoint(w, h);
addPoint(0, h);
addPoint(ht, h / 2);
}
private void rightarrow()
{
addPoint(x, y);
addPoint(w - ht, y);
addPoint(w, h / 2);
addPoint(w - ht, h);
addPoint(y, h);
}
private void botharrows()
{
addPoint(x, y);
addPoint(w - ht, y);
addPoint(w, h / 2);
addPoint(w - ht, h);
addPoint(x, h);
addPoint(ht, h / 2);
}
private void noarrow()
{
addPoint(x, y);
addPoint(w, y);
addPoint(w, h);
addPoint(x, h);
}
}
Java:
JLabel l = new JLabel("Test") {
private static final long serialVersionUID = 1L;
public void paint( Graphics g ) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Rectangle r = getBounds();
Polygon p = new Arrow(120, r, Arrow.LEFTARROW);
g2.drawPolygon(p);
g2.setPaint(Color.WHITE);
g2.fillPolygon(p);
super.paint(g);
}
};
Mein Programm wift jetzt 2 Probleme auf:
1. wenn ich mein Polygon fülle, dann geht mein schöner Rahmen verloren weil die Füllung den Rahmen an manchen Stellen überlagert. Das sieht schrecklich aus. Kann man das verhindern?
2. ich möchte mein JLabel nun so umschreiben, dass setHorizontalAlignment(JLabel.CENTER) den Text und / oder das Icon nun nicht mehr genau mittig platziert sondern leicht versetzt (je nach Pfeilspitze).
Ich kriegs einfach nicht auf die Reihe! Hab mir schon den Source von JLabel, JComponent, Container und Component durchgesehen.
Hab schon probiert, in der paint()-Methode vor super.paint() ein setBounds zu setzen. Hab auch schon probiert die setAlignmentX Methode zu überschreiben. Nichts hilft! Wisst ihr da weiter?!
mfg, guni
Zuletzt bearbeitet von einem Moderator: