質問

現在、Swingコンポーネントを実装しようとしていますが、これは JLabel を継承しているだけです。

これから始めましょう:

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;

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

そして単純に Graphics オブジェクトを変換してから、ペイントを元の 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);
}

テキストが縦に表示されるようになったという点で、どうやらうまくいくようです。ただし、配置とサイズはオフです。

実際には、背景の幅(この場合はオレンジ色)は周囲の JFrame の高さと同じです。

適切な方法でそれを解決する方法はありますか?スーパークラスへのレンダリングの委任はさらに奨励されていますか?

役に立ちましたか?

解決

同僚の少しの助けを借りて、すぐに動作するようになりました。基本的に、元の JLabel がペイントを行うときにのみアクティブになる高さ/幅を交換するかどうかを示すフィールドがあります。

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

他のヒント

今では関連性があるかどうかわかりませんが、 しかし、同じことを検索しているときに、Webで非常に優れた実装を見つけました。 http://macdevcenter.com/pub/a/mac/2002 /03/22/vertical_text.html

チェックしてください。これは、垂直テキストを使用したTabbedPaneの実装です。 目的に合っているかどうかを確認してください。

私はこれで遊びましたが、ラベルの境界が正確に正方形であり、ラベルの右側のコンポーネントがシフトして不明瞭になるため、最初はあまりうまくいきませんでした。しかし、それから私はJGoodies FormLayoutを使用しているためだと気付きました。このレイアウトマネージャーを使用する場合は、列サイズを「優先」に設定してください。 「デフォルト」ではありません。 HTH。

間違った点について翻訳しているため、オフになっていると思います。

オブジェクトのサイズは、これが入っているコンテナによって異なります。そのため、好みのサイズが必要なサイズかもしれませんが、実際のサイズは違いますか?

BorderLayoutのCENTERにこのラベルがある場合、サイズは常にコンテナのフルサイズ(マイナス北+南の高さ、マイナス東+西の幅)です

では、実際のサイズではなく、推奨サイズについて翻訳する必要がありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top