Question

J'essaie actuellement d'implémenter un composant Swing, héritant de JLabel , qui devrait simplement représenter une étiquette pouvant être orientée verticalement.

Commençant par ceci:

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;

J'ai pensé que ce serait une bonne idée de 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();
    }
}

puis transformez simplement l'objet Graphics avant de décharger la peinture de son contenu vers JLabel d'origine:

@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);
}

Cela semble fonctionner - en quelque sorte - en ce sens que le texte est maintenant affiché verticalement. Cependant, l'emplacement et la taille sont désactivés.

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

Des idées sur la manière de résoudre ce problème? La délégation du rendu aux super-classes est-elle même encouragée?

Était-ce utile?

La solution

Je l'ai maintenant au travail avec l'aide d'un collègue. En gros, j’ai maintenant un champ qui indique s’il faut ou non permuter hauteur / largeur, qui n’est actif que lorsque le JLabel original est peint.

private boolean needsRotate;

@Override
public Dimension getSize() {
  if (!needsRotate) {
    return super.getSize();
  }

  Dimension size = super.getSize();

  switch (getDirection()) {
  case VERTICAL_DOWN:
  case VERTICAL_UP:
      return new Dimension(size.height, size.width);
  default:
    return super.getSize();
  }
}

@Override
public int getHeight() {
  return getSize().height;
}

@Override
public int getWidth() {
  return getSize().width;
}

@Override
protected void paintComponent(Graphics g) {
  Graphics2D gr = (Graphics2D) g.create();

  switch (getDirection()) {
  case VERTICAL_UP:
    gr.translate(0, getSize().getHeight());
    gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
    break;
  case VERTICAL_DOWN:
    gr.transform(AffineTransform.getQuadrantRotateInstance(1));
    gr.translate(0, -getSize().getWidth());
    break;
  default:
  }

  needsRotate = true;
  super.paintComponent(gr);
  needsRotate = false;
}

Autres conseils

Je ne sais pas si c'est pertinent maintenant, Mais en cherchant la même chose, j’ai trouvé une très bonne implémentation sur le Web, http://macdevcenter.com/pub/a/mac/2002 /03/22/vertical_text.html

Regardez, c'est une implémentation sur le TabbedPane avec du texte vertical, Voyez si cela vous convient.

J'ai eu un jeu avec cela, cela ne fonctionnait pas très bien au début parce que les limites de l'étiquette étaient exactement carrées et que les composants à droite de l'étiquette changeaient et devenaient obscurs. Mais j'ai alors réalisé que c'était parce que j'utilisais JGoodies FormLayout. Si vous utilisez ce gestionnaire de disposition, veillez à définir la taille de colonne sur "préféré". pas "par défaut". HTH.

Je pense que c'est désactivé parce que vous traduisez sur le mauvais point.

la taille de l'objet dépend du conteneur dans lequel vous l'avez, alors si votre taille préférée peut être celle que vous voulez, votre taille réelle ne l'est pas?

si vous avez cette étiquette dans le CENTRE d'un BorderLayout, la taille est toujours celle du conteneur (moins la hauteur nord + sud, moins la largeur est + ouest)

alors vous n'avez pas à traduire à propos de la taille réelle, pas la taille préférée?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top