7

私は現在、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です... これは、私が考えていたものではありません。

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

4

4 に答える 4

9

同僚の助けを借りて、今では動作するようになりました。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;
}
于 2009-03-09T12:54:57.680 に答える
2

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

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

于 2012-04-05T19:11:09.147 に答える
0

あなたは間違った点について翻訳しているので、それはずれていると思います。

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

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

では、好みのサイズではなく、実際のサイズについて翻訳する必要はありませんか?

于 2009-03-07T00:45:45.033 に答える