Frage

Ich bin derzeit versucht, eine Swing-Komponente zu implementieren, von JLabel vererben, die einfach ein Etikett darstellen sollen, die vertikal ausgerichtet werden können.

Der Beginn mit diesem:

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;

Ich dachte, es ist eine nette Idee, um nur die Ergebnisse von getPreferredSize() zu ändern:

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

und dann einfach das Graphics Objekt transformiert, bevor ich Malerei auf den ursprünglichen JLabel Offload:

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

Es scheint zu funktionieren-irgendwie-in, dass der Text jetzt vertikal angezeigt wird. Allerdings Platzierung und Größe ist aus.

Eigentlich ist die Breite des Hintergrunds (orange in diesem Fall) identisch mit der Höhe des umgebenden JFrame das ist ... nicht ganz das, was ich im Sinne hatte.

Alle Ideen, wie das in der richtigen Weise zu lösen? Delegiert Rendering sogar ermutigt Super?

War es hilfreich?

Lösung

Ich habe es jetzt von einem Kollegen mit einer wenig Hilfe zu arbeiten. Grundsätzlich ist jetzt ein Feld haben, ob Höhe zu tauschen gibt / Breite, die nur aktiv für die Zeit ist, wenn die ursprüngliche JLabel hat seine Malerei.

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

Andere Tipps

Ich weiß nicht, ob es jetzt relevant ist, Aber während für die gleiche Sache sucht, fand ich eine sehr gute Umsetzung im Web, http://macdevcenter.com/pub/a/mac/2002 /03/22/vertical_text.html

überprüfen Sie sie heraus, es ist eine Implementierung über den TabbedPane mit vertikalem Text ist, Sehen Sie, wenn es Ihnen Zwecke Suiten.

ich ein Spiel mit diesem gehabt haben, es funktionierte nicht sehr gut am Anfang, weil die Label Grenzen waren exakt quadratisch und verursacht Komponenten auf der rechten Seite des Etiketts verdeckt zu verschieben und werden. Aber dann merkte ich, dass es war, weil ich JGoodies Formlayout verwenden. Wenn Sie das Layout-Manager verwenden, stellen Sie sicher, stellen Sie die Spaltengröße „bevorzugte“ nicht „default“. HTH.

Ich denke, es weg ist, weil Sie über den falschen Punkt übersetzen.

die Größe des Objekts hängt davon ab, welchen Behälter Sie dies in haben, also, während Ihre bevorzugte Größe könnte sein, was Sie wollen, Ihre tatsächliche Größe nicht?

Wenn Sie das Label in der Mitte eines Border haben, die Größe ist immer die volle Größe des Behälters (minus Nord + Süd Höhe, minus Ost + West-Breite)

so haben Sie nicht über die tatsächliche Größe zu übersetzen, nicht bevorzugt Größe?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top