Domanda

Attualmente sto cercando di implementare un componente Swing, ereditando da JLabel che dovrebbe semplicemente rappresentare un'etichetta che può essere orientata verticalmente.

A partire da questo:

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;

Ho pensato che sarebbe stata una buona idea modificare i risultati da 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();
    }
}

e quindi trasforma semplicemente l'oggetto Graphics prima di scaricare il disegno sul JLabel originale:

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

Sembra funzionare, in qualche modo, in quanto il testo è ora visualizzato in verticale. Tuttavia, posizionamento e dimensioni sono disattivati.

In realtà, la larghezza dello sfondo (arancione in questo caso) è identica all'altezza del JFrame circostante che non è esattamente quello che avevo in mente.

Qualche idea su come risolverlo in modo corretto? La delega del rendering alle superclassi è persino incoraggiata?

È stato utile?

Soluzione

Ora ho funzionato con un piccolo aiuto di un collega. Fondamentalmente ora ho un campo che indica se scambiare altezza / larghezza che è attivo solo per il momento in cui l'originale JLabel fa il suo disegno.

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

Altri suggerimenti

Non so se sia rilevante ormai, Ma mentre cercavo la stessa cosa, ho trovato un'ottima implementazione nel web, http://macdevcenter.com/pub/a/mac/2002 /03/22/vertical_text.html

Dai un'occhiata, è un'implementazione su TabbedPane con testo verticale, Vedi se è adatto ai tuoi scopi.

Ho giocato con questo, inizialmente non funzionava molto bene perché i limiti dell'etichetta erano esattamente quadrati e causavano lo spostamento e l'oscuramento dei componenti a destra dell'etichetta. Ma poi ho capito che era perché sto usando JGoodies FormLayout. Se utilizzi questo gestore di layout, assicurati di impostare la dimensione della colonna su "preferito" non " default " ;. HTH.

Penso che sia spento perché stai traducendo sul punto sbagliato.

la dimensione dell'oggetto dipende dal contenitore in cui si trova questo, quindi mentre la dimensione preferita potrebbe essere quella desiderata, la dimensione effettiva non lo è?

se hai questa etichetta nel CENTRO di un BorderLayout, la dimensione è sempre la dimensione intera del contenitore (meno nord + altezza sud, meno est + ovest larghezza)

quindi non devi tradurre sulla dimensione effettiva, non sulla dimensione preferita?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top