Faire pivoter un Swing JLabel

Je suis en train d'essayer de mettre en œuvre un composant Swing, héritant de JLabel qui devrait représenter simplement une étiquette qui peut être orienté verticalement.

À partir de cette:

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;

Je pensais que c'est une bonne idée de simplement modifier les résultats 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();
    }
}

et puis il suffit de transformer le Graphics objet avant de me décharger de la peinture à l'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);
}

Il semble fonctionner—en quelque sorte—que le texte est maintenant affichée verticalement. Toutefois, le placement et la taille sont éteints.

En fait, la largeur de l'arrière-plan (en orange dans ce cas) est identique à la hauteur de l'entourage JFrame qui est ... pas tout à fait ce que j'avais à l'esprit.

Toutes les idées sur la façon de le résoudre de manière adéquate? Délègue, le rendu des superclasses même encouragé?

raté "(" dans gr.translate0, getPreferredSize().getHeight());

OriginalL'auteur Joey | 2009-03-06