2009-03-06 3 views
7

現在、スウィングコンポーネントを実装しようとしています。これは、JLabelから継承しています。このスウィングコンポーネントは、単に垂直方向に向けることができるラベルを表す必要があります。この以降でスウィングJLabelを回転する

@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オブジェクトを変換する:

public class RotatedLabel extends JLabel { 

    public enum Direction { 
    HORIZONTAL, 
    VERTICAL_UP, 
    VERTICAL_DOWN 
    } 

    private Direction direction; 

は、私はそれだけでgetPreferredSize()からの結果を変えるのはいいアイデアかもだと思いました元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); 
    } 
} 

これはうまくいくように見えます。何とかテキストが垂直方向に表示されるようになりました。しかし、配置とサイズはオフになっています:

実際には、背景の幅(この場合はオレンジ)は周囲の高さと同じです。これは私が気にしていたものではありません。

どのように適切な方法でそれを解決するためのアイデアですか?スーパークラスへのレンダリングを委任することさえ奨励されていますか?

+0

"(" gr.translate0、getPreferredSize()。getHeight()); ' – brownian

答えて

8

私は同僚の助けを借りて現在作業しています。基本的には、元の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; 
} 
+0

フルクラスを提供できますか? –

+1

http://hypftier.de/dump/RotatedLabelを参照してください。java - 言及されたライセンスは、かなり自由なもので、BSDの後ろにモデル化されています(ライセンステキストはこれまでのところドイツ語でしか利用できません)。 – Joey

0

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

オブジェクトのサイズは、どのコンテナに格納されているかによって異なりますので、希望のサイズがあなたの望むサイズになるかもしれませんが、実際のサイズはありませんか?

あなたはBorderLayoutの中心部にあるラベルを持っている場合、サイズは常にフルコンテナのサイズ(マイナス北+南高さ、マイナス東+西幅)である

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

+0

Hmm ... not ...かなり。ラベルの垂直(現在は水平)配置が中央に配置されているため、配置が少しずれていますが、サイズは正方形になりました。スーパークラスが私のオーバーライドされたgetPreferredSizeメソッドを気にしないので、私の境界に関してではなく、それ自身を描画することができますか? – Joey

2

それが今では関連性がある場合、私は知りませんが、 は、しかし、同じものを探している間、私はウェブ上で非常に良い実装、 http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html

はそれをチェックアウトを発見し、それがありますTabbedPane上に実装された、垂直テキストの を実装しています。

2

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

関連する問題