Actualmente estoy tratando de implementar un componente Swing, heredando de JLabel
, que simplemente debe representar una etiqueta que se puede orientar verticalmente.Girar un Swing JLabel
A partir de esto:
public class RotatedLabel extends JLabel {
public enum Direction {
HORIZONTAL,
VERTICAL_UP,
VERTICAL_DOWN
}
private Direction direction;
pensé que es ser una buena idea para simplemente alterar los resultados de getPreferredSize()
:
@Override
public Dimension getPreferredSize() {
// swap size for vertical alignments
switch (getDirection()) {
case VERTICAL_UP:
case VERTICAL_DOWN:
return new Dimension(super.getPreferredSize().height, super
.getPreferredSize().width);
default:
return super.getPreferredSize();
}
}
y luego simplemente transformar el objeto Graphics
antes de la descarga de la pintura a la original JLabel
:
@Override
protected void paintComponent(Graphics g) {
Graphics2D gr = (Graphics2D) g.create();
switch (getDirection()) {
case VERTICAL_UP:
gr.translate(0, getPreferredSize().getHeight());
gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
break;
case VERTICAL_DOWN:
// TODO
break;
default:
}
super.paintComponent(gr);
}
}
Parece que funciona, de alguna manera, porque ahora el texto se muestra verticalmente. Sin embargo, la ubicación y el tamaño están desactivados:
En realidad, el ancho del fondo (naranja en este caso) es idéntico a la altura del JFrame
circundante, que no es exactamente lo que tenía en mente.
¿Alguna idea de cómo resolverlo de forma adecuada? ¿Se recomienda incluso delegar la representación en superclases?
perdido "(" en 'gr.translate0, getPreferredSize(). GetHeight());' – brownian